サービスの障害と例外処理をテストしていますが、奇妙な結果が出ています。
2つのエンドポイントが構成された1つのサービス契約があります。1つはbasicHttpBindingで、もう1つはwsHttpBindingです。私のマシンでは、ローカルでテストアプリクライアントとサーバーを実行しています。両方のWebサービスバインディングを正常に呼び出すことができ、両方で探している例外を取得できます。これはまさに私が探しているものです。しかし、コードを開発サーバーにプッシュすると、wsHttpBindingエンドポイントを正常に呼び出すことしかできません。基本エンドポイントは奇妙なメッセージを返します。例外は「リモートサーバーがエラーを返しました:(500)内部サーバーエラー」です。
例外メッセージは次のとおりです。
「応答メッセージのコンテンツタイプtext/htmlがバインディングのコンテンツタイプと一致しません(text / xml; charset = utf-8)。カスタムエンコーダーを使用している場合は、IsContentTypeSupportedメソッドが正しく実装されていることを確認してください。応答の1024バイトは次のとおりでした:ここに意味のないhtmlの束を挿入してください "
これは構成エラーですか?IISエラー?ファイアウォールの問題?サーバーでWCFロギングとトレースを実行しました。私のコードは問題なくヒットし、障害例外を問題なくスローしています。basicHttpBindingのメッセージヘッダーは空ですが、それが問題かどうかはわかりません。IISログも確認しました。500個のエラーが表示されますが、それだけです。他に確認すべきことはありますか?
私のエンドポイント:
<endpoint
address=""
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IEOIEligible_NONSSL"
name="IEOIEligible_Svc_endpoint_NONSSL"
contract="Engine.IEOIEligible">
</endpoint>
<endpoint
address="mex"
binding="mexHttpBinding"
name="Mex_Svc_endpoint"
contract="IMetadataExchange" />
<endpoint
address="/basic"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IEOIEligible"
name="basicEOIEndpoint"
contract="Engine.IEOIEligible" />
[編集]
バインディング構成:
basicHttpBinding
<binding name="BasicHttpBinding_IEOIEligible" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
messageEncoding="Text" textEncoding="utf-8" transferMode="Streamed"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="Certificate" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Certificate" algorithmSuite="Default" />
</security>
</binding>
wsHttpBinding
<binding name="WSHttpBinding_IEOIEligible_NONSSL" closeTimeout="00:10:00"
openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
maxBufferPoolSize="524288" maxReceivedMessageSize="524288" messageEncoding="Text"
textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="819200" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
</binding>
WCFトレースファイルから:
成功した呼び出し(wsHttp):
<ExtendedData xmlns="http://schemas.microsoft.com/2006/08/ServiceModel/MessageTraceRecord">
<MessageProperties>
<Encoder>application/soap+xml; charset=utf-8</Encoder>
<AllowOutputBatching>False</AllowOutputBatching>
</MessageProperties>
<MessageHeaders>
<Action d4p1:mustUnderstand="1" xmlns:d4p1="http://www.w3.org/2003/05/soap-envelope" xmlns="http://www.w3.org/2005/08/addressing">http://tempuri.org/IEOIEligible/VerifyEOIRequiredEOIEligibilityFaultFault</Action>
<RelatesTo xmlns="http://www.w3.org/2005/08/addressing">urn:uuid:5863c107-b721-4b4c-88b8-0d03c22175d1</RelatesTo>
<ActivityId CorrelationId="a498440c-2e5a-4298-9bc5-ade08d51933c" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">00000000-0000-0000-0000-000000000000</ActivityId>
</MessageHeaders>
</ExtendedData>
サーバー500(basicHttp)
<ExtendedData xmlns="http://schemas.microsoft.com/2006/08/ServiceModel/MessageTraceRecord">
<MessageProperties>
<Encoder>text/xml; charset=utf-8</Encoder>
<AllowOutputBatching>False</AllowOutputBatching>
</MessageProperties>
<MessageHeaders></MessageHeaders>
</ExtendedData>
[編集]
Microsoft WCFテストクライアントを介してbasicHttpBindingを使用してサービスから応答を取得できますが、それはサーバーでFaultExceptionをスローしない場合のみです。つまり、サービスはハッピーパスを返しました。ありがたいことに、この部分は関係ありません。
クライアントの例外処理を単体テストしていますが、サーバーは基本で500を返していますが、wsHttpBindingは返していません。wsHttpBindingは、soap本体に埋め込まれた適切なSOAP障害を返しますが、基本はそうではありません。Soapフォールトは、実際のサーバーからではなくローカルで実行された場合、basicHttpBindingで返されます。