Système.Web.Services.Les protocoles.SoapException: le Serveur n'a pas pu traiter la demande. ---> Système.ArgumentNullException
J'ai l'erreur:
Système.Web.Services.Les protocoles.SoapException: le Serveur n'a pas pu traiter la demande. ---> Système.ArgumentNullException
Quand j'essaie d'appeler mon webservice en utilisant le code suivant:
{
//Create an echoSync request - set the services.
ServiceNameType sourceService = new ServiceNameType {Service = "echoSync", OnBehalfOf = "Source"};
ServiceNameType destService = new ServiceNameType {Service = "echoSync", OnBehalfOf = "Destination"};
//Create the request.
SDD2RequestType request = new SDD2RequestType
{
AppId = "echoSync",
SourceService = sourceService,
DestService = destService,
RequestId = "1",
RequestBody = "Ping"
};
//Create the originator.
originator originator = new originator {id = "123456789"};
//Create the transport.
SDD2Transport transport = new SDD2Transport {originatorValue = originator};
//Send the request.
SDD2ResponseType response = null;
response = transport.SDD2TransportOp(request);
//Write out the response.
System.Console.WriteLine(response.ResponseBody.ToString());
}
Mon webservice méthode est assez simple et il ressemble à ceci:
[System.Web.Services.Protocols.SoapHeaderAttribute("originatorValue", Direction = System.Web.Services.Protocols.SoapHeaderDirection.InOut)]
[System.Web.Services.WebMethodAttribute()]
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://memberdirect.net/SDD2/Transport", RequestElementName = "SDD2Transport", RequestNamespace = "http://cucbc.com/sdd2/transport/", ResponseElementName = "SDD2TransportResponse", ResponseNamespace = "http://cucbc.com/sdd2/transport/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Default)]
[return: System.Xml.Serialization.XmlElementAttribute("SDD2Response", Namespace = "http://cucbc.com/sdd2/")]
public override SDD2ResponseType SDD2TransportOp(SDD2RequestType SDD2Request)
{
if (SDD2Request == null) throw new ArgumentNullException("SDD2Request");
var response = new SDD2ResponseType();
switch (SDD2Request.AppId)
{
case "echoSync":
response.AppId = SDD2Request.AppId;
response.ProcessingStatus = ProcessingStatusType.Complete;
response.RequestId = SDD2Request.RequestId;
response.ResponseBody = "Pong";
break;
default:
throw new System.NotImplementedException();
break;
}
return response;
}
Quand je fais l'appel, je sais que la demande n'est pas NULLE mais quand il arrive à la webservice, il est toujours reçu comme null. J'ai généré le service web à partir de WSDL à l'aide de la wsdl.exe utilitaire et clairement je ne comprends pas tous les détails de SAVON que je devrais. Quelqu'un d'autre a rencontré ce problème?
OriginalL'auteur Daver | 2009-02-18
Vous devez vous connecter pour publier un commentaire.
Je n'ai aucune idée de ce qui provoque ce donc ce n'est pas une réponse à votre question, mais seulement une suggestion sur la manière d'approfondir le problème
Essayez d'utiliser un sniffer pour voir les données envoyées entre les machines et le savoir de quel côté est le problème. J'ai utilisé Wireshark avec succès la fois.
OriginalL'auteur configurator
J'ai eu le même problème, bien que la cause peut être différent. Quand j'ai passé mon code dans le débogueur, l'argument de méthode est passée d'une instance à une valeur nulle.
Pour le dossier, il a été causé par la RequestElementName être différent pour le nom de la méthode. Il peut y avoir d'autres facteurs d'influence, mais quand j'ai retiré le RequestElementName attribut à partir de la définition de la méthode ou j'ai fait le même que le nom de la méthode, le problème avec l'argument null disparu.
Par exemple, votre code a RequestElementName = "SDD2Transport" et le nom de la méthode SDD2TransportOp.
Maintenant, je ne sais pas pourquoi cela devrait être un problème, surtout que vous avez aussi: ParameterStyle = Système.Web.Services.Les protocoles.SoapParameterStyle.Par défaut, pas d'enveloppe, ce qui implique que la ElementName ne sera pas utilisé de toute façon.
Je me demande si c'est un bug dans le .NET client SOAP en classe de protocole car ce qui se passe est que, bien que la bonne méthode est appelée dans le service web (parce qu'il est identifié dans le SAVON d'Action en-tête), les arguments ne pas obtenir désérialisé.
Dans mon cas, j'ai dû modifier le générés C# de la classe à chaque fois que j'ai recréé afin de supprimer le RequestElementName attributs. Remarque que je n'avais aucun contrôle sur la source WSDL comme il était alimenté par une 3ème partie.
OriginalL'auteur Rob Kent
Je n'ai pas eu l'occasion de les utiliser Wireshark comme Configurateur suggéré, mais j'ai été en mesure de résoudre ce problème par la mise à Jour de la Référence Web dans l'Explorateur de solutions.
Je suis un peu chagriné d'avoir trouvé une solution simple à ce, après avoir lutté avec elle pendant plus d'une heure mais j'espère que ce post aidera quelqu'un là-bas.
OriginalL'auteur Daver
"paramètre est reçu comme null" signifie presque toujours qu'il existe une différence entre les noms qualifiés attendu par le serveur, et ceux qui sont envoyés par le client. XML le nom complet se compose de l'espace de noms plus le nom local. Cette usally signifie que l'espace de noms est incorrecte sur le côté client, si j'ai vu un rapport de différence avec le nom de l'.
En tout cas, vous avez trouvé la solution n ° 1 pour le problème - "mise à Jour de la Référence Web".
OriginalL'auteur John Saunders