ローカル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を作成する最初の試みなので、非常に新しいものです。どんな助けも大歓迎です。
クライアントが通常実行するのと同じWindows資格情報を使用して、サービスをホストするサーバー上のWebブラウザーで http://localhost/ScraperService.svc を参照してみてください。
IISは、期待どおりにxmlを返すのではなく、何らかの説明のhtmlエラーメッセージを表示していると思います。
これは、インターネットフィルタリングを実行するhttpプロキシサーバーがある場合にも発生する可能性があります。 ContentKeeperでの私の経験では、http/httpsトラフィックをインターセプトし、「管理されていないコンテンツ」としてブロックします。返されるのはHTMLエラーメッセージだけです。これを回避するには、プロキシがサイトへのトラフィックを傍受しないように、プロキシサーバーの例外ルールをInternet Explorerに追加します。
コントロールパネル>インターネットオプション>接続> LAN設定>詳細>プロキシ設定
通常、WebサーバーからのHTML応答は、WCFサービスからの応答の代わりにエラーページが提供されたことを示します。私の最初の提案は、WCFクライアントを実行しているユーザーがリソースにアクセスできることを確認することです。
同様の問題がありました。変更して解決しました
<basicHttpBinding>
に
<basicHttpsBinding>
また、http://ではなくhttps://を使用するようにURLを変更しました。
また、<endpoint>ノードで、変更します
binding="basicHttpBinding"
に
binding="basicHttpsBinding"
これはうまくいきました。
何が起こっているのかは、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" >
それはそれを行う必要があります。
サービスの構成を調べて、すべてが正常であることを確認したい場合があります。ブラウザーを介してWebサービスに移動し、ブラウザーでスキーマがレンダリングされるかどうかを確認できます。
また、サービスの呼び出しに使用される資格情報を調べることもできます。
ネットワークプロキシを使用しない場合でも、プロキシダイアログで[設定を自動的に検出する]をオンにすると、この例外が発生しなくなります。
私の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がある場合でも生成されます。
多くの場合と同様に、私の状況では、エラーのためにこれを取得していました。そして悲しいことに、htmlエラーページのCSSを読むことができました。
私の問題の原因は、サーバー上の書き換えルールにもありました。 httpをhttpsに書き換えていました。
私も同様の状況にありましたが、クライアントの構成は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>
上記のすべての提案を試しましたが、最終的に機能したのは、アプリケーションプール管理パイプラインを統合モードからクラシックモードに変更することでした。
独自のアプリケーションプールで実行されますが、それは最初の.NET 4.0サービスでした-他のすべてのサービスは、統合パイプラインモードを使用する.NET 2.0上にあります。使用する標準のWCFサービスはhttpsだけです-Server 2008(R2ではありません)-IIS 7(7.5ではありません)を使用します。
私の場合、URL書き換えルールがサービス名を混乱させていたため、小文字に書き換えられ、このエラーが発生していました。
WCFサービス呼び出しを小文字にしないでください。
Httpsリクエストとともにwshttpbindingを両方使用している場合、以下の設定変更を使用して解決しました。
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" />
<message clientCredentialType="Certificate" />
</security>
注:ターゲットサーバーエンドポイントがSecure Socket Layer(SSL)証明書を使用している場合
.config設定をbasicHttpBinding
からbasicHttpsBinding
に変更します
きっと、あなたの問題は解決するでしょう。
Web.configでUseCookiesを設定することでこの問題を解決しました。
<system.web>
<sessionState cookieless="UseCookies" />
enableVersionHeaderの設定
<system.web>
<httpRuntime targetFramework="4.5.1" enableVersionHeader="false" executionTimeout="1200" shutdownTimeout="1200" maxRequestLength="103424" />
こんにちは、私の場合、Webサービスのアプリケーションプールの32/64ビット設定が間違っていたため、このエラーが表示されました。そのため、このエラーには次の修正が必要でした。IISに移動し、webserviceのサイトを選択し、詳細設定に移動してアプリケーションプールを取得します。次に、アプリケーションプールに移動して選択し、[詳細設定...]に移動して、[32ビットアプリケーションを有効にする]を選択し、Webサービスの32/64ビットタイプに応じて有効または無効にします。設定がTrueの場合、32ビットアプリケーションのみが許可されることを意味するため、64ビットアプリの場合は「無効」(デフォルト)にする必要があります。
私にとって、Web.configで次の行をコメントすると、問題は解決しました。
<httpErrors errorMode="Detailed" />
X ++ binding = endPoint.get_Binding(); binding.set_UseDefaultWebProxy(false);
私にとっては、間違ったデータベースサーバーを指すWebアプリ接続文字列でした。