web-dev-qa-db-ja.com

WCFサービスクライアント:コンテンツタイプtext / html。応答メッセージのcharset = utf-8がバインディングのコンテンツタイプと一致しません

ローカルIISサーバーでWCFサービスを実行しています。これをC#Webサイトプロジェクトへのサービス参照として追加しました。これにより、問題なく追加され、プロキシクラスが自動的に生成されます。

ただし、サービスコントラクトのいずれかを呼び出そうとすると、次のエラーが表示されます。

説明:現在のWeb要求の実行中に未処理の例外が発生しました。エラーの詳細とコードのどこで発生したかについては、スタックトレースを確認してください。

例外の詳細: System.ServiceModel.ProtocolException:コンテンツタイプtext/html;応答メッセージのcharset = utf-8がバインディングのコンテンツタイプ(application/soap + xml; charset = utf-8)と一致しません。カスタムエンコーダーを使用する場合は、IsContentTypeSupportedメソッドが適切に実装されていることを確認してください。応答の最初の1024バイトは次のとおりでした。 'function bredir(d、u、r、v、c){var w、h、wd、hd、bi; var b = false; var p = false; var s = [[ 300,250、false]、[250,250、false]、[240,400、false]、[336,280、false]、[180,150、false]、[468,60、false]、[234,60、false]、[88,31、 false]、[120,90、false]、[120,60、false]、[120,240、false]、[125,125、false]、[728,90、false]、[160,600、false]、[120,600、false] 、[300,600、false]、[300,125、false]、[530,300、false]、[190,200、false]、[470,250、false]、[720,300、true]、[500,350、true]、[550,480、true]]; if(typeof(window.innerHeight)== 'number'){h = window.innerHeight; w = window.innerWidth;} else if(typeof(document.body.offsetHeight)== 'number'){h = document。 body.offsetHeight; w = document.body.offsetWidth;} for(var i = 0; i

また、WCFサービスとも通信するコンソールアプリケーションがあり、コンソールアプリはこのエラーを取得せずにメソッドを正常に呼び出すことができます。

以下は私の設定ファイルからの抜粋です。

WCFサービスWeb.Config:

<system.serviceModel>
   <services>
      <service name="ScraperService" behaviorConfiguration="ScraperServiceBehavior">
         <endpoint address=""
                   binding="wsHttpBinding" 
                   bindingConfiguration="WSHttpBinding_IScraperService"
                   contract="IScraperService" />
         <endpoint address="mex" 
                   binding="mexHttpBinding" 
                   contract="IMetadataExchange" />
         <Host>
            <baseAddresses>
                <add baseAddress="http://example.com" />
            </baseAddresses>
         </Host>
      </service>
   </services>
   <bindings>
       <wsHttpBinding>
           <binding name="WSHttpBinding_IScraperService"
                    bypassProxyOnLocal="false" transactionFlow="false"
                    hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="2000000" maxReceivedMessageSize="2000000"
                    messageEncoding="Text" textEncoding="utf-8"
                    useDefaultWebProxy="true" allowCookies="false">
               <readerQuotas 
                     maxDepth="2000000" maxStringContentLength="2000000" 
                     maxArrayLength="2000000" maxBytesPerRead="2000000"
                     maxNameTableCharCount="2000000" />
               <reliableSession 
                     enabled="false" ordered="true" inactivityTimeout="00:10:00" />
               <security mode="Message">
                   <message clientCredentialType="Windows"
                            negotiateServiceCredential="true"
                            algorithmSuite="Default"
                            establishSecurityContext="true" />
               </security>
            </binding>
          </wsHttpBinding>
      </bindings>
      <behaviors>
          <serviceBehaviors>
              <behavior name="ScraperServiceBehavior">
                  <serviceMetadata httpGetEnabled="true" />
                  <serviceDebug includeExceptionDetailInFaults="true" />
              </behavior>
          </serviceBehaviors>
     </behaviors>
</system.serviceModel>

ウェブサイトプロジェクトサービスクライアントWeb.Config

<system.serviceModel>
   <bindings>
      <wsHttpBinding>
          <binding name="WSHttpBinding_IScraperService" 
              closeTimeout="00:01:00" openTimeout="00:01:00" 
              receiveTimeout="00:10:00" sendTimeout="00:01:00"
              bypassProxyOnLocal="false" transactionFlow="false" 
              hostNameComparisonMode="StrongWildcard"
              maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
              messageEncoding="Text" textEncoding="utf-8"
              useDefaultWebProxy="true" allowCookies="false">
              <readerQuotas 
                  maxDepth="32" maxStringContentLength="8192" 
                  maxArrayLength="16384" maxBytesPerRead="4096" 
                  maxNameTableCharCount="16384" />
              <reliableSession enabled="false"
                  ordered="true" inactivityTimeout="00:10:00" />
              <security mode="Message">
                  <transport clientCredentialType="Windows" 
                       proxyCredentialType="None" realm="" />
                  <message clientCredentialType="Windows" 
                       negotiateServiceCredential="true"
                       algorithmSuite="Default" />
              </security>
          </binding>
       </wsHttpBinding>
    </bindings>
<client>
        <endpoint name="WSHttpBinding_IScraperService"
            address="http://example.com/ScraperService.svc"
            binding="wsHttpBinding" 
            bindingConfiguration="WSHttpBinding_IScraperService"
            contract="ScraperService.IScraperService" >
           <identity>
               <servicePrincipalName value="Host/FreshNET-II" />
           </identity>
        </endpoint>
     </client>
</system.serviceModel>

これは、WCFを作成する最初の試みなので、非常に新しいものです。どんな助けも大歓迎です。

60
Dan Ellis

クライアントが通常実行するのと同じWindows資格情報を使用して、サービスをホストするサーバー上のWebブラウザーで http://localhost/ScraperService.svc を参照してみてください。

IISは、期待どおりにxmlを返すのではなく、何らかの説明のhtmlエラーメッセージを表示していると思います。

これは、インターネットフィルタリングを実行するhttpプロキシサーバーがある場合にも発生する可能性があります。 ContentKeeperでの私の経験では、http/httpsトラフィックをインターセプトし、「管理されていないコンテンツ」としてブロックします。返されるのはHTMLエラーメッセージだけです。これを回避するには、プロキシがサイトへのトラフィックを傍受しないように、プロキシサーバーの例外ルールをInternet Explorerに追加します。

コントロールパネル>インターネットオプション>接続> LAN設定>詳細>プロキシ設定

enter image description here

26
sheikhjabootie

通常、WebサーバーからのHTML応答は、WCFサービスからの応答の代わりにエラーページが提供されたことを示します。私の最初の提案は、WCFクライアントを実行しているユーザーがリソースにアクセスできることを確認することです。

17
DaveRead

同様の問題がありました。変更して解決しました

<basicHttpBinding>

<basicHttpsBinding>

また、http://ではなくhttps://を使用するようにURLを変更しました。

また、<endpoint>ノードで、変更します

binding="basicHttpBinding" 

binding="basicHttpsBinding"

これはうまくいきました。

12
radkan

何が起こっているのかは、wsHttpBindを使用してサービスにアクセスしようとしていることです。wsHttpBindは、既定でセキュリティで保護された暗号化メッセージ(セキュリティで保護されたメッセージ)を使用します。一方、netTcpBindは、セキュリティで保護された暗号化チャネルを使用します。 (セキュアなトランスポート)...しかし、basicHttpBind、セキュリティをまったく必要とせず、匿名でアクセスできます

そう。サーバー側で、これを構成に追加\変更します。

<bindings>
    <wsHttpBinding>
     <binding name="wsbind"> 
         <security mode="Message">
             <transport clientCredentialType="Windows" proxyCredentialType="None" />
             <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
         </security>
     </binding>
    </wsHttpBinding>
</bindings>

次に、エンドポイントの変更を追加します

<endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsbind" name="wshttpbind" contract="WCFService.IService" > 

それはそれを行う必要があります。

5
mahmoud

サービスの構成を調べて、すべてが正常であることを確認したい場合があります。ブラウザーを介してWebサービスに移動し、ブラウザーでスキーマがレンダリングされるかどうかを確認できます。

また、サービスの呼び出しに使用される資格情報を調べることもできます。

1
William

ネットワークプロキシを使用しない場合でも、プロキシダイアログで[設定を自動的に検出する]をオンにすると、この例外が発生しなくなります。

enter image description here

1
Michal Minich

私のWCFサービスプロジェクトでは、この問題はSystem.Web.Mvc.dllの異なるバージョンの参照が原因です。したがって、DLLの異なるバージョンの互換性の問題である可能性があります

使用するとき

System.Web.Mvc.dllバージョン5.2.2.-> it-throws the Errorコンテンツタイプtext/html;応答メッセージのcharset = utf-8

しかしSystem.Web.Mvc.dllバージョン4.0.0.0以前-> it 正常に動作しますを使用する場合。

異なるバージョンのDLLの問題の理由はわかりませんが、DLLのバージョンを変更することで機能します。

このエラーは、WCFプロジェクトに他のプロジェクトの参照を追加し、この参照プロジェクトに異なるバージョンのSystem.Web.Mvc DLLまたは他のDLLがある場合でも生成されます。

1
Dilip0165

多くの場合と同様に、私の状況では、エラーのためにこれを取得していました。そして悲しいことに、htmlエラーページのCSSを読むことができました。

私の問題の原因は、サーバー上の書き換えルールにもありました。 httpをhttpsに書き換えていました。

1
Pedro

私も同様の状況にありましたが、クライアントの構成はbasicHttpBindingを使用していました。問題は、サービスがSOAP 1.2を使用しており、basicHttpBindingでSOAP 1.2を指定できないことでした。代わりにcustomBindingを使用するようにクライアント構成を変更し、すべてが機能しました。参照用にcustomBindingの詳細を次に示します。消費しようとしたサービスは、UserNameOverTransportを使用したHTTPS経由でした。

<customBinding>
    <binding name="myBindingNameHere" sendTimeout="00:03:00">
        <security authenticationMode="UserNameOverTransport" includeTimestamp="false">
            <secureConversationBootstrap />
        </security>
        <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
              messageVersion="Soap12" writeEncoding="utf-8">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </textMessageEncoding>
        <httpsTransport manualAddressing="false" maxBufferPoolSize="4194304"
              maxReceivedMessageSize="4194304" allowCookies="false" authenticationScheme="Basic"
              bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
              keepAliveEnabled="true" maxBufferSize="4194304" proxyAuthenticationScheme="Anonymous"
              realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
              useDefaultWebProxy="true" requireClientCertificate="false" />
    </binding>
</customBinding>
1
Yves Rochon

上記のすべての提案を試しましたが、最終的に機能したのは、アプリケーションプール管理パイプラインを統合モードからクラシックモードに変更することでした。
独自のアプリケーションプールで実行されますが、それは最初の.NET 4.0サービスでした-他のすべてのサービスは、統合パイプラインモードを使用する.NET 2.0上にあります。使用する標準のWCFサービスはhttpsだけです-Server 2008(R2ではありません)-IIS 7(7.5ではありません)を使用します。

1
T Camp

私の場合、URL書き換えルールがサービス名を混乱させていたため、小文字に書き換えられ、このエラーが発生していました。

WCFサービス呼び出しを小文字にしないでください。

1
Valentin Kuzub

Httpsリクエストとともにwshttpbindingを両方使用している場合、以下の設定変更を使用して解決しました。

 <security mode="TransportWithMessageCredential">
                    <transport clientCredentialType="None" />
                    <message clientCredentialType="Certificate" />
                </security>
0
Siva Kumar B

注:ターゲットサーバーエンドポイントがSecure Socket Layer(SSL)証明書を使用している場合

.config設定をbasicHttpBindingからbasicHttpsBindingに変更します

きっと、あなたの問題は解決するでしょう。

0
Raj Anand

Web.configでUseCookiesを設定することでこの問題を解決しました。

  <system.web>
    <sessionState cookieless="UseCookies" />

enableVersionHeaderの設定

  <system.web>
    <httpRuntime targetFramework="4.5.1" enableVersionHeader="false" executionTimeout="1200" shutdownTimeout="1200" maxRequestLength="103424" />
0
user6300391

こんにちは、私の場合、Webサービスのアプリケーションプールの32/64ビット設定が間違っていたため、このエラーが表示されました。そのため、このエラーには次の修正が必要でした。IISに移動し、webserviceのサイトを選択し、詳細設定に移動してアプリケーションプールを取得します。次に、アプリケーションプールに移動して選択し、[詳細設定...]に移動して、[32ビットアプリケーションを有効にする]を選択し、Webサービスの32/64ビットタイプに応じて有効または無効にします。設定がTrueの場合、32ビットアプリケーションのみが許可されることを意味するため、64ビットアプリの場合は「無効」(デフォルト)にする必要があります。

0
mihai71

私にとって、Web.configで次の行をコメントすると、問題は解決しました。

<httpErrors errorMode="Detailed" />
0
Ali

X ++ binding = endPoint.get_Binding(); binding.set_UseDefaultWebProxy(false);

0
Danish

私にとっては、間違ったデータベースサーバーを指すWebアプリ接続文字列でした。

0
Leo Gurdian