Als Teil meiner Arbeit, ich schreibe einen SOAP 1.2-basierten Webservice, der XML-Anfragen empfängt und verarbeitet. Beim Testen mit dem Remote-Client stieß ich jedoch auf ein ziemlich verwirrendes und inkonsistentes Problem. C# SOAP-Service-Methode empfängt Null-Parameter anstelle von
Dies ist die Unterschrift eines der aufrufbaren Methoden des Service:
[WebMethod]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Xml)]
public XmlDocument PostOrders(XmlDocument request)
Das Problem ist folgende:
- Wenn das Verfahren von einer minimalistischen Testanwendung aufgerufen wird, ich schrieb, es funktioniert richtig.
- Wenn die php-basierte Anwendung meines Clients die Methode aufruft, wird der Methode ein Null
request
übergeben und dementsprechend wird einNullReferenceException
auf der ganzen Linie ausgelöst, wenn die Anwendung versucht, ihren Inhalt in Datei zu schreiben. Es spielt keine Rolle, was der Client tatsächlich gesendet hat. Wenn Sie Visual Studio an den IIS-Prozess anhängen, wird die Methode mit nullrequest
aufgerufen, wobei der tatsächlich gesendete Client irgendwo auf der .NET-Ebene verloren gegangen ist.
Was ich versucht:
- Unabhängige Tests. This erzeugt das gleiche Problem - aber die gleiche Anfrage in SoapUI kopiert wurde ordnungsgemäß empfangen. Deshalb habe ich oben gesagt, dass dieses Problem inkonsistent ist: Zwei von vier Anwendungen, jeweils auf verschiedenen Computern, reproduzieren das Problem, die anderen beiden nicht.
- Offenbar kann dies geschehen, wenn der Server SOAP 1.2 erwartet, aber 1.1 erhält, und ich es reproduzieren konnte, indem ich die Anforderung absichtlich als 1.1 in SoapUI posten. So deaktivierte ich sowohl 1.1 als auch das grundlegende HTTP in
web.config
(das Verifizieren, dass beide aus WSDL verschwanden, nur die 1.2 verlassend) und den Client explizit Version 1.2 auf ihrer Seite definierte. Kein Würfel. - Nach dem Ändern des Dienstes wechselte die clientseitige WSDL-Definition der Methode abrupt von
XmlDocument
zu LinqXElement
. Wenn Sie ein serverseitiges Deserialisierungsproblem aufgrund der Feststellung, dass WSDL die erwarteten Datentypen für Multiplatform-Kompatibilität abstrahiert, vermuten, habe ich den Parameter der Methode vonXmlDocument
inXElement
geändert. Kein Würfel.
Inhalt von 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>
man bedenkt, dass ich in der Lage war erfolgreich Anfrage senden von zwei separaten Computern in zwei separaten Anwendungen ohne manuelle Konfiguration, aber nicht von einer anderen zwei, das ist ein server- Nebenproblem oder eine clientseitige Fehlkonfiguration?