8

過去 2 時間の 400 - BadRequest コードを調査しました。bindingConfiguration 属性が正しく設定されていることを確認するための多くの提案があり、私の場合はそうです。

今、私がいる建物を破壊する前に、あなたの助けが必要です :-)

私は WCF RestFull サービスを実行します (非常に軽量で、インスピレーションのためにこのリソースを使用します: http://msdn.microsoft.com/en-us/magazine/dd315413.aspx )。投稿動詞。

現在、真のクライアントを実装する前に、Fiddler のリクエストビルダーのみを使用しています (これは混合環境であるため)。

65K より小さい XML に対してこれを行うと、正常に動作します。それより大きい場合、次の例外がスローされます: 着信メッセージの最大メッセージ サイズ クォータ (65536) を超えました。クォータを増やすには、適切なバインド要素で MaxReceivedMessageSize プロパティを使用します。

これが私のweb.configファイルです(これには(絶望的な時代のためのクライアントタグも含めました!)):

<system.web>
    <httpRuntime maxRequestLength="1500000" executionTimeout="180"/>
  </system.web>
  <system.serviceModel>
    <diagnostics>
      <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
    </diagnostics>
    <bindings>
      <webHttpBinding>
        <binding name="WebHttpBinding" maxReceivedMessageSize="1500000" maxBufferPoolSize="1500000" maxBufferSize="1500000" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00">
          <readerQuotas maxStringContentLength="1500000" maxArrayLength="1500000" maxBytesPerRead="1500000" />
          <security mode="None"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <client>
      <endpoint address="" binding="webHttpBinding" bindingConfiguration="WebHttpBinding" contract="Commerce.ICatalogue"/>
    </client>
    <services>
      <service behaviorConfiguration="ServiceBehavior" name="Catalogue">
        <endpoint address="" 
                  behaviorConfiguration="RestFull" 
                  binding="webHttpBinding"
                  bindingConfiguration="WebHttpBinding" 
                  contract="Commerce.ICatalogue" />
        <!-- endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" / -->
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="RestFull">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

65K を超える XML での呼び出しを成功させるための助けを前もって感謝します ;-)

4

4 に答える 4

13

わかりました、これは本当に解決に苦労しました。他の人には惜しみません。課題は、私が を使用したという事実にありました<%@ ServiceHost Factory="System.ServiceModel.Activation.WebServiceHostFactory" Service="fullyQualifiedClassName" %>。これは、素晴らしく簡単なファクトリ実装アプローチです。

ただし、このアプローチには欠点があります。web.config ファイルでの構成は必要ないため、設計上、WebServiceHostFactory クラスは web.config ファイルから読み取ることはありません。知っている; このクラスから継承し、適切な変更を加えて実際に構成ファイルから読み取ることができますが、これは少し範囲外に思えました。

私の解決策は、WCF を実装する従来の方法に戻ることでした。<%@ ServiceHost Service="fullyQualifiedClassName" CodeBehind="~/App_Code/Catalogue.cs" %>、web.config ファイルで既に構成されている値を使用します。

これが私の変更されたweb.configファイルです(マドックスの頭痛に関して):

<system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="XmlMessageBinding" maxReceivedMessageSize="5000000" maxBufferPoolSize="5000000" maxBufferSize="5000000" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00">
          <readerQuotas maxStringContentLength="5000000" maxArrayLength="5000000" maxBytesPerRead="5000000" />
          <security mode="None"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service name="fullyQualifiedClassName" behaviorConfiguration="DevelopmentBehavior">
        <endpoint name="REST" address="" binding="webHttpBinding" contract="fullyQualifiedInterfaceName" behaviorConfiguration="RestEndpointBehavior" bindingConfiguration="XmlMessageBinding" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="RestEndpointBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="DevelopmentBehavior">
          <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
        <behavior name="ProductionBehavior">
          <serviceDebug httpHelpPageEnabled="false" includeExceptionDetailInFaults="false"/>
          <serviceMetadata httpGetEnabled="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

この変更のもう 1 つの利点は、WCF-rest サービスを .NET から直接参照できるようになったことです。これは、Factory モデルとソリューション全体の XmlElement の実装を使用して行うことはできません。

これが同様の問題を抱えている他の人に役立つことを願っています...

于 2009-09-18T14:22:51.897 に答える
7

私はこれが非常に古い質問であることを知っています、そしてそれはすでに答えを持っています...

ともかく...

この「問題」を解決するために行ったことWebServiceHostFactoryから継承されたファクトリを作成し、WebServiceHostから継承されたカスタムサービスホストを作成しました

そして、ホストで私はこのようにOnOpeningメソッドをオーバーライドしました

protected override void OnOpening()
        {
            base.OnOpening();

            foreach (var endpoint in Description.Endpoints)
            {
                var binding = endpoint.Binding as System.ServiceModel.Channels.CustomBinding;

                foreach (var element in binding.Elements)
                {
                    var httpElement = element as System.ServiceModel.Channels.HttpTransportBindingElement;
                    if (httpElement != null)
                    {
                        httpElement.MaxBufferSize = 2147483647;
                        httpElement.MaxReceivedMessageSize = 2147483647;
                    }
                }
            }

        }
于 2012-01-19T12:01:07.290 に答える
6

私は同じ問題を抱えていたと思いますが、webHttpのデフォルトバインディングを設定するとうまくいきました:

<bindings>
        <webHttpBinding>
            <binding maxReceivedMessageSize="2000000"
                      maxBufferSize="2000000">
                <readerQuotas maxStringContentLength="2000000"/>
            </binding>
        </webHttpBinding>
    </bindings>

注意: バインディングに名前はありません。

于 2012-10-04T08:36:54.663 に答える
0

これは私が書いたブログ エントリで、この問題を最小限の WCF サーバーとクライアントで再現しています。

WCF - クライアント側の文字列長の例外を修正する

特に、カスタム バインディング構成が必要になる場合があります。少なくともこのサンプルを再現することで、特定の状況についていくつかのアイデアが得られるかもしれません。

于 2009-09-17T17:56:30.117 に答える