私の仕事の一環として、XMLリクエストを受信して処理するSOAP 1.2ベースのWebサービスを作成します。しかし、リモートクライアントでのテストでは、わずらわしく矛盾した問題が発生しました。C#SOAPサービスメソッドは、
これは、サービスの呼び出し可能なメソッドの1の署名である:
[WebMethod]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Xml)]
public XmlDocument PostOrders(XmlDocument request)
ここでの問題はこれです:メソッドは、それが動作しますが、私が書いたミニマルなテストアプリケーションから呼び出されると
- 正しく。
- 私のクライアントのPHPベースのアプリケーションがメソッドを呼び出すと、メソッドはNULL
request
を渡し、アプリケーションがその内容をファイルに書き込もうとしたときに、NullReferenceException
を下にスローします。 Visual StudioをIISプロセスに接続してクライアントが実際に送信した内容は問題ではありません。クライアントが実際に送信した内容が.NETレベルでどこかで失われていることが原因で、このメソッドがnullrequest
で呼び出されていることがわかります。- 独立テスト:私が試した何
。 Thisでも同じ問題が発生しますが、SoapUIにコピーされた要求と同じものが正しく受信されます。上記の理由から、この問題は矛盾していると言われています.4つのアプリケーションのうち2つは、それぞれ異なるコンピュータにあり、問題を再現し、他の2つは発生しません。
- これは、サーバーがSOAP 1.2を期待していても1.1を受け取った場合に発生する可能性があり、要求を意図的に1.1としてSoapUIに送信して再現できたようです。そこで、
web.config
で1.1と基本HTTPの両方を無効にしました(両方ともWSDLから消えて、1.2だけ残していることを確認しています)。サイコロはありません。 - サービスを変更した後、メソッドのクライアント側WSDL定義が突然
XmlDocument
からLinqXElement
に切り替わりました。 WSDLがマルチプラットフォームとの互換性のために予想されるデータ型を抽象化することを発見したことによるサーバー側のデシリアライゼーションの問題を疑うと、メソッドのパラメータをXmlDocument
からXElement
に変更しました。サイコロはありません。web.config
の
内容:私は成功した任意の手動設定なしではなく、別の2から2つの別々のアプリケーションに2台の別個のコンピュータからの要求を送信することができたことを考えると
<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>
、これはサーバ - ですクライアント側の問題またはクライアント側の設定ミス?