1

サービスの障害と例外処理をテストしていますが、奇妙な結果が出ています。

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で返されます。

4

3 に答える 3

2

basicHttpエンドポイントでも同じエラーが発生しました。web.configのエンコーディングを「Ansiasutf8」から「utf8」に変更することにしました。

于 2012-11-22T16:26:06.307 に答える
1

私は自分の質問の問題を理解しました。これは単純な構成変更でした(見つけるのに数時間かかりました)。私のバインディングで私は変更しました

transferMode="Streamed"

transferMode="Buffered"
于 2012-06-25T14:24:56.343 に答える
0

私は2日間探し回っていましたが、解決策と、カスタムSOAPフォールトを使用するWCFサービスが機能しなかった理由の説明を探していました。IISは、同じクライアント側の例外を除いて、代わりにhttp500エラーを吐き出しました。応答メッセージのtext/htmlがバインディングのコンテンツタイプと一致しません..."

最悪のことは、IIS Expressでローカルに機能するか、ServiceHostインスタンスを使用することです。

あなたの答えは私が問題を診断して解決するのに大いに役立ちました、それでありがとう。

これが私の解決策と興味のある人のための説明です。


通常、障害を使用する場合、クライアントへの応答は、エラーの詳細を含むSOAP xmlメッセージ(text / xmlメッセージエンコーダーを使用する場合)です。

Fiddlerを使用して、バッファモードとストリーミングモードの両方でクライアントに返送された応答を傍受して確認することができました。

バッファモードでの応答メッセージは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
   <s:Header>
      <a:Action s:mustUnderstand="1">http://tempuri.org/ISIAdministration/MyServiceBusinessFaultFault</a:Action>
      <a:RelatesTo>urn:uuid:a6a89101-7d95-4e7b-9871-c43792559f16</a:RelatesTo>
   </s:Header>
   <s:Body>
      <s:Fault>
         <s:Code>
            <s:Value>s:Sender</s:Value>
         </s:Code>
         <s:Reason>
            <s:Text xml:lang="fr-FR">Le créateur de cette erreur n'a pas spécifié de raison.</s:Text>
         </s:Reason>
         <s:Detail>
            <BusinessFault xmlns="http://schemas.datacontract.org/2004/07/GI.Framework.Error" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
               <MyCode>test</MyCode>
               <MyMessage>test</MyMessage>
            </BusinessFault>
         </s:Detail>
      </s:Fault>
   </s:Body>
</s:Envelope>

そして、ストリームモードでの応答メッセージは次のとおりです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>500 - Erreur interne au serveur.</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;} 
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;} 
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} 
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}
-->
</style>
</head>
<body>
<div id="header"><h1>Erreur de serveur</h1></div>
<div id="content">
 <div class="content-container"><fieldset>
  <h2>500 - Erreur interne au serveur.</h2>
  <h3>La ressource que vous recherchez présente un problème, elle ne peut donc pas être affichée.</h3>
 </fieldset></div>
</div>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
   <s:Header>
      <a:Action s:mustUnderstand="1">http://tempuri.org/ISIAdministration/MyServiceBusinessFaultFault</a:Action>
      <a:RelatesTo>urn:uuid:a6a89101-7d95-4e7b-9871-c43792559f16</a:RelatesTo>
   </s:Header>
   <s:Body>
      <s:Fault>
         <s:Code>
            <s:Value>s:Sender</s:Value>
         </s:Code>
         <s:Reason>
            <s:Text xml:lang="fr-FR">Le créateur de cette erreur n'a pas spécifié de raison.</s:Text>
         </s:Reason>
         <s:Detail>
            <BusinessFault xmlns="http://schemas.datacontract.org/2004/07/GI.Framework.Error" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
               <MyCode>test</MyCode>
               <MyMessage>test</MyMessage>
            </BusinessFault>
         </s:Detail>
      </s:Fault>
   </s:Body>
</s:Envelope>

何か奇妙なことに気づきましたか?

私が無視する理由で、IISはバッファリングされた応答またはストリーミングされた応答に対して同じ方法でエラーを処理しないようであり、実際には、予期されるxmlメッセージの前にカスタム500エラーページのコンテンツを挿入します!!!

IISContent-Typeは、応答のをtext / htmlに変更します。これにより、例外メッセージが説明されます。

そのため、ストリーミングメッセージからバッファリングされたメッセージに切り替えると、問題が修正されましたが、私の場合、数百メガバイトのデータを転送する必要があったため、この修正は受け入れられませんでした。


おそらくIISのバグであり、私の側からの構成の問題ではないという事実を受け入れたら、解決策を見つけるのは簡単でした。

TL; DR:

問題はIISカスタムエラーページに起因するため、サービスに対してそれらを無効にする必要があります。これは、IIS管理パネルから、またはweb.configファイルに単純な構成ディレクティブを追加して、既存の障害メッセージを変更せずに通過させるようにIISに指示することによって実行されます。

<system.webServer>
    <httpErrors existingResponse="PassThrough" />
</system.webServer>

以上です!

于 2015-06-19T15:59:31.433 に答える