Une exception se produit lorsque j'essayais d'appeler une méthode sur un service Web:
System.Web.Services.Protocols.SoapException: Server did not recognize the value of HTTP Header SOAPAction: http://localhost:53460/3Development/MyWebService.asmx/GetBasePath.
at System.Web.Services.Protocols.Soap11ServerProtocolHelper.RouteRequest()
at System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage message)
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)
L'espace de noms du service Web:
[WebService(Namespace = "http://internaltest.temp.us/MyWebService.asmx")]
J'ai effectué des recherches et découvert que cette exception fonctionnait bien parce que l'espace de nom du service Web référencé dans le projet était différent de celui du serveur Web, mais j'ai essayé de supprimer la référence Web et de l'ajouter à nouveau au projet, mais le résultat était toujours le même.
Ma situation était semblable à celle de l'article ci-dessous:
http://bluebones.net/2003/07/server-did-not-recognize-http-header-soapaction/
De l'article:
Donc, fondamentalement, le service Web a été déplacé de http://foo.com/servicename Vers http://bar.com/servicename mais le «namespace» du service Web est resté en tant que http://foo.com/servicename car personne ne l’a changé.
Le problème est:
Comment changer l'espace de noms de la référence Web?
En plus de supprimer et d'ajouter des références Web, vous pouvez essayer de régénérer les proxies en utilisant wsdl.exe comme suggéré here , avec à nouveau l'espace de noms. J'espère que ça aide
J'ai également eu la même exception lors de l'appel d'un service Web. Dans mon code client, j'utilisais incorrectement l'espace de noms pour faire référence au WebService. Ainsi, chaque fois que j'ai été référé au WebService, j'ai utilisé des noms complets tels que: Namespace.WebService, ce qui a résolu le problème pour moi.
Partager mon expérience, parce que cela peut aider quelqu'un.
Exemple pour expliquer le cas:
Méthode actuelle:
[WebMethod]
public string Bar(){
}
Vous l'avez renommé en Foo
[WebMethod]
public string Foo(){
}
Méthode appelée à tort:
objectName.Bar();
Appel correct:
objectName.Foo();
Un conflit de nom} _ (en raison du changement de nom de la méthode Web) entre la méthode Web réelle et la méthode appelée peut être à l'origine du problème.
Une autre façon effrontée d’obtenir l’erreur est que si vous modifiez de manière dynamique l’URL du noeud final et que vous insérez une adresse asmx au lieu d’une adresse wcf, et inversement.
Cela peut se produire lorsque la valeur de la propriété SOAPAction
du WS n'est pas définie (null
) ou n'est pas correcte dans la demande envoyée. J'utilise la bibliothèque Apache pour me connecter aux services de mon projet actuel. Vous trouverez ci-dessous ma solution/solution de contournement.
import org.Apache.axis.client.Call;
import org.Apache.axis.client.Service;
call = (Call) service.createCall();
call = setUseSOAPAction(true);
Puisqu'il n'y a pas de méthode setSoapAction
pour mon cas Apache, j'ai utilisé leur méthode setProperty
et attribué manuellement le nom SOAPAction
à cette propriété.
call.setProperty("SOAPAction", "expected SOAPAction value");
call.setSOAPActionURI("expected SOAPAction value");
Je ne pouvais pas appeler le service sans utiliser ces deux méthodes en même temps.
J'espère que cela aidera.