2010-04-25 7 views
0

Je suis en train de configurer un service Web pour qu'un client externe se connecte à l'application de mon client et mette à jour certaines informations. Je suis allé sur la route ASMX (le reste de l'application fonctionne sur WCF) parce que je savais que le client externe pouvait être très difficile à gérer et j'essayais de tout garder aussi simple que possible. Ils ne sont pas non plus un magasin .Net qui aggrave les choses. Après avoir obtenu la configuration du service pour eux, j'ai fourni l'URL ASMX pour qu'ils voient comment formater les en-têtes/messages SOAP. Ils sont revenus depuis et m'ont dit que leur outil est incapable de les envoyer dans le format requis par .Net et que je peux soit trouver une façon différente d'accepter les messages, soit nous devons aller avec le FTP. Sur cette base, j'ai recherché comment intercepter leur message, le reformater comme mon service l'exige (ce qui signifie ajouter deux lignes), puis le laisser traiter. Ce chemin m'a conduit à des extensions SOAP avec lesquelles j'ai essayé de travailler mais que je n'arrive pas à comprendre. Lorsque j'ai mon exemple d'application appelez le service Web à partir du code généré Ajouter Web Reference fournit tout fonctionne bien jusqu'à ce que j'ajoute dans mon extension. Tout ce qu'il fait actuellement est prioritaire ChainStream la fixation d'un flux interne égal à celui qui est passé et le retour d'un nouveau flux, comme celui-ci:Services Web ASMX avec extension SOAP

private Stream newStream = null; 
private Stream oldStream = null; 

public override Stream ChainStream(Stream stream) 
{ 
    this.oldStream = stream; 
    this.newStream = new MemoryStream(); 
    return newStream; 
} 

Je surchargeons aussi ProcessMessage et faut-il le contenu de oldStream et mis NewStream égale pour cela et ensuite écrire dans un flux différent avec un XmlWriter. Je prends ce nouveau flux et en utilisant un StreamReader le lire dans une chaîne, avec l'objectif final en le manipulant ici et en définissant newStream (qui est utilisé par ChainStream) égal au contenu de ceci. Voici ce morceau:

public override void ProcessMessage(SoapMessage message) 
{ 
    switch (message.Stage) 
    { 
     case SoapMessageStage.BeforeDeserialize: 
      this.Process(); 
      break; 

     default: break; 
    } 
} 

private void Process() 
{ 
    this.newStream.Position = 0L; 
    XmlTextReader reader = new XmlTextReader(this.oldStream); 
    MemoryStream outStream = new MemoryStream(); 
    using (XmlWriter writer = XmlWriter.Create(outStream)) 
    { 
     do { writer.WriteNode(reader, true); } while (reader.Read()); 
     writer.Flush(); 
    } 
    outStream.Seek(0, SeekOrigin.Begin); 
    StreamReader streamReader = new StreamReader(outStream); 
    string message = streamReader.ReadToEnd(); 
    newStream = outStream; 
    newStream.Seek(0, SeekOrigin.Begin); 
    streamReader.Close(); 

} 

En exécutant ce qui me semble que ce serait bien, ma demande de test obtient 400 Bad Request retour du service. Si je n'utilise pas l'extension ou si je ne fais rien dans ProcessMessage, tout semble correct. Des suggestions à cela?

En guise de remarque, une fois que je vais travailler avec le code généré par le WSDL, je vais passer à une demande de WebRequest pour essayer d'envoyer le message au service. À l'heure actuelle, cette opération est déclenchée par une réponse 415 Type de support non pris en charge. J'essaie de garder ce post à une question, mais si quelqu'un a des conseils pour utiliser une demande de WebRequest pour se connecter à un service ASMX, ce serait très apprécié!

Répondre

1

Je réalise que ce n'est pas la réponse que vous cherchez, mais pourquoi ne pas simplement utiliser REST au lieu de SOAP? Puisque le principal (seulement?) Consommateur du service ne va pas se conformer, essayer de «réparer» ses appels n'est qu'une couche supplémentaire de complexité. Au lieu de cela, utilisez simplement une page aspx qui accepte des données sur la chaîne de requête ou avec un corps de requête xml, traitez-la, puis renvoyez-y la réponse xml (ou autre format). Vous perdez la "magie" Visual Studio SOAP qui génère automatiquement des informations de type etc. mais comme ils n'utilisent pas (ou n'admettent pas d'utiliser) une langue avec une bibliothèque SOAP, cela n'aide pas vraiment n'importe qui.

+0

Intéressant ... Je n'avais pas pensé à ça, mais c'est logique. Je vais l'étudier un peu plus loin car, si rien d'autre, un POST standard à une page pourrait être parfait (mais pas idéal) juste pour passer cela. Merci! – RubyHaus

+0

On dirait que cela va me prendre le chemin dont j'ai besoin. Merci encore! – RubyHaus

Questions connexes