2011-12-23 14 views
3

.NET 4.0 WCFサービスがあります。 64Kを超えるSOAPメッセージを送信すると、「リモートサーバーが予期しない応答を返しました:(400)Bad Request」エラーが発生します。私は64Kのメッセージサイズを調べるまで、うまく動作します。私はこのエラーのために何をすべきかについて多くの投稿を読んできました。私が知る限り、正しいweb.config値を持っていますが、まだエラーが出ます。以下は私のweb.configの設定です。私が紛失しているものは何ですか?これは、ローカルのASP.NET VSサーバーとリモートのWindows 2008 R2 IISサーバーの両方に通信するときに発生します。リアルタイムまたはデバッガでサービスバインディングにあるmaxReceivedMessageSize設定などを確認またはログする方法はありますか?何か違いがあれば、サービスはMVCでホストされます。クライアント側では メッセージサイズが64Kを超えるとHTTP 400の要求エラーがWCFサービスで発生する

<bindings> 
    <basicHttpBinding> 

    <binding name="IpsApiBinding" receiveTimeout="00:15:00" sendTimeout="00:05:00" maxReceivedMessageSize="40000000"> 
     <readerQuotas maxDepth="5000000" maxStringContentLength="50000000" 
     maxArrayLength="50000000" maxBytesPerRead="50000000" /> 
    </binding> 

    </basicHttpBinding> 
</bindings> 


<services> 

    <service behaviorConfiguration="ApiBehavior" name="IPSApi.IpsApi"> 
    <endpoint behaviorConfiguration="endpointBehavior" binding="basicHttpBinding" 
     bindingConfiguration="IpsApiBinding" name="IPSApi.IpsApi" 
     contract="IPSApi.IIPSApi" /> 
    </service> 

</services> 

<behaviors> 

    <endpointBehaviors> 
    <behavior name="endpointBehavior"> 
     <dataContractSerializer maxItemsInObjectGraph="6553600" /> 
     <callbackDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </endpointBehaviors> 

    <serviceBehaviors> 
    <behavior name="ApiBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 

</behaviors> 

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 

は、スタックのトラックが表示されている
<httpRuntime maxRequestLength="50000000" /> 

... 

は... ...

サーバースタックトレース: System.ServiceModelで.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest System.ServiceModel.Channels.RequestChannel.RequestでSystem.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(のTimeSpan タイムアウト)(メッセージのメッセージで3210要求、HttpWebResponseの応答、HttpChannelFactory工場、 WebException responseException、でChannelBindingでChannelBinding) System.ServiceModel.Channels.ServiceChannel.Call(文字列アクションで System.ServiceModel.Dispatcher.RequestChannelBinder.Request(メッセージ メッセージ、のTimeSpanタイムアウト)において、 のTimeSpanタイムアウト)、 ブール一方向、ProxyOperationRuntime動作は、[]インオブジェクト、 Object [] outs、TimeSpan timeout): System.ServiceModel.Channels.ServiceChannel .call System.ServiceModel.ChannelsでSystem.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCallで、ProxyOperationRuntime動作)時(文字列アクション、 ブール一方向、ProxyOperationRuntime動作は、[]イン、 オブジェクト[]アウトオブジェクト) .ServiceChannelProxy.Invoke(IMessageが メッセージ)例外再スロー[0]で: System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessageが reqMsg、IMessageがretMsg)における...

+0

サーバー側でエラーが表示されますか。これがIISでホストされている場合、イベントログにはASP.NETのイベントソースが表示される可能性があります。 –

+0

サーバー側でエラーは発生しません - イベントログも例外もありません – Ron

+0

すべての設定を試しましたか(こちら)(http://stackoverflow.com/a/1189191/291687) – Lester

答えて

3

私は自分の問題を理解しました。ここに詳細があります。 MVCアプリケーションでWCFサービスをホストしています。 WCFサービスは別のDLLにあります。私はウェブで設定をしていました。それはそこから設定を読むことを考えて設定します。別のDLLであれば、web.configの設定は使用されません。

web.configの設定を読むには、http://blogs.msdn.com/b/dotnetinterop/archive/2008/09/22/custom-service-config-file-for-a-wcf-service-hosted-in-iis.aspxで提案されている方法を使用しました。私は自分のカスタムServiceHostFactoryとServiceHostを作成しました。 ServiceHostFactory.CreateServiceHostでは、ServiceHost(派生クラス)のインスタンスを作成します。私のServiceHost派生クラスでは、私はApplyConfigurationを引き継ぎ、web.configから設定を読み込みます。

0

Iは、同様でした私のコードでは見えないバインディングの2つの追加フィールドを増やさなければなりませんでした... maxBufferSize a nd maxBufferPoolSize。これがあなたの問題であるかどうかは分かりませんが、これらのデフォルトは約64kです。

サンプルのWeb.configの設定:

<binding name="HTTPNoneBinding" closeTimeout="00:01:00" openTimeout="00:01:00" 
     receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" 
     bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" 
     maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
+0

ありがとう、これを試しても、まだ動作しませんでした。私はトレースの提案を試み、私がこれを理解できるかどうかを見極めるつもりです。 – Ron

+0

トレースオプションを試してみたところ、maxReceivedMessageSizeを設定する必要があると言いました。私はそれをweb.configで非常に高い値に設定しました。 OperationContextを使用して調査した結果、Webサービスのバインディングを表示して、それらがすべてデフォルト値に設定されていることに気づくことができました。基本的に、web.configのバインディングは無視されています。私は何が起こっているのか知っているかもしれないと思う。私はここで説明されている方法を使用してMVCルートテーブルにサービスを追加しています。http://stackoverflow.com/questions/4047485/expose-wcf-services-that-belong-to-an-area-in-mvc-app- at-a-routed-path。 – Ron

+0

続き...私は、このメソッドを使ってweb.configの設定を無視することを考えています。 .svcファイルではなく、mvcルートを使用してWebサービスにアクセスしています。実際、私は.svcファイルを持っていません。 – Ron

0

私は不正な要求の正確な原因を判断するために、あなたのサービスでトレースを有効にするためにお勧めします。それがメッセージサイズのためにある場合、フレームワークは、どのプロパティを設定する必要があるかを明確に伝えます。トレースを有効にするには、これに従います。link

関連する問題