Dans le cadre de mon travail, je dois écrire un service Web SOAP 1.2 qui reçoit et traite les requêtes XML. Au cours des tests avec le client distant, cependant, j'ai rencontré un problème plutôt déconcertant et incohérent.La méthode de service SOAP C# reçoit un paramètre null au lieu de
C'est la signature de l'une des méthodes de services appelables:
[WebMethod]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Xml)]
public XmlDocument PostOrders(XmlDocument request)
Le problème est ici:
- Lorsque la méthode est appelée à partir d'une application de test minimaliste je l'ai écrit, il travaille correctement.
- Lorsque l'application php de mon client appelle la méthode, la méthode passe un
request
nul et, par conséquent, lance unNullReferenceException
sur la ligne lorsque l'application tente d'écrire son contenu dans le fichier. Peu importe ce que le client a effectivement envoyé, attacher Visual Studio au processus IIS révèle que la méthode est appelée avec unrequest
nul, avec ce que le client a réellement envoyé ayant été perdu quelque part au niveau .NET.
Ce que j'essayé:
- tests indépendants. This produit le même problème - mais la même requête copypgée dans SoapUI est correctement reçue. C'est pourquoi j'ai indiqué plus haut que ce problème est incohérent: deux applications sur quatre, chacune sur des ordinateurs différents, reproduisent le problème, les deux autres ne le font pas.
- Apparemment, cela peut arriver si le serveur attend SOAP 1.2 mais reçoit 1.1, et j'ai été capable de le reproduire en postant intentionnellement la requête en tant que 1.1 dans SoapUI. J'ai donc désactivé à la fois le 1.1 et le HTTP de base dans
web.config
(en vérifiant que les deux avaient disparu de WSDL, ne laissant que le 1.2) et que le client définissait explicitement la version 1.2 de leur côté. Pas de dé. - Après modification du service, la définition WSDL côté client de la méthode est passée brusquement de
XmlDocument
à LinqXElement
. Soupçonnant un problème de désérialisation côté serveur dû à la découverte que WSDL abstrait les types de données attendus pour la compatibilité multiplateforme, j'ai changé le paramètre de la méthode deXmlDocument
àXElement
. Pas de dé.
Contenu de web.config
:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime />
<webServices>
<protocols>
<remove name="HttpGet" />
<remove name="HttpPost" />
<remove name="HttpSoap"/> <!-- disables SOAP 1.1 -->
</protocols>
<conformanceWarnings>
<remove name='BasicProfile1_1'/>
</conformanceWarnings>
</webServices>
<globalization uiCulture="en-US" />
<customErrors mode="Off" />
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" />
<httpModules>
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
</httpModules>
</system.web>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<providerOption name="CompilerVersion" value="v4.0" />
</compiler>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" />
</compilers>
</system.codedom>
<system.webServer>
<modules>
<remove name="ApplicationInsightsWebTracking" />
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
</modules>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
<system.serviceModel>
<bindings />
<client />
</system.serviceModel>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Considérant que j'ai pu envoyer avec succès la demande de deux ordinateurs distincts dans deux applications distinctes, sans aucune configuration manuelle, mais pas d'un autre deux, est-ce un server- problème secondaire ou une mauvaise configuration côté client?