0

JQuery .AJAX を使用して WCF Web サービスを呼び出し、処理するアイテムのコレクションを渡します。ほとんどの場合は正常に動作しますが、POST 時にコレクションに多数のアイテムがあると、すぐにエラー 400 が発生します。

jQueryコードは次のとおりです。

   //  Get the selected items
    var oAssayOrderListSelected = jQuery.grep(oAssayOrderList, function (element, index) {
        return element.SelectedForProcessing == true;
    });

    DataAsJson = { "SelectedItems": oAssayOrderListSelected };
    var DataAsJsonString = JSON.stringify(DataAsJson);

    //  Call the web service to Process the Assays
    $.ajax({
        cache: false,
        url: "AssayControlWS.svc/ProcessOrdersForAssays",
        type: "POST",
        async: true,
        dataType: "json",
        data: DataAsJsonString,
        contentType: "application/json; charset=utf-8",
        success: function (processingResults) {
            //  Update the results table with the result information
            if (processingResults.Status == "Success") {
            }
            else {
                // insert error message handler!!!!!
            }
        },

以下は、呼び出される Web サービス メソッドの宣言です。

[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest,   ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
public ReleaseResult ProcessOrdersForAssays(List<AssayGroupOrOrderSummary> SelectedItems)
    {    ... }

サービスの web.config エントリは次のとおりです。それが示すように、バッファサイズをデフォルトから大幅に増やしました

           <service name="AssayControl_Web.AssayControlWS" behaviorConfiguration="metadataAndDebug">
            <endpoint address="" behaviorConfiguration="AssayControl_Web.AssayControlWSAspNetAjaxBehavior"
                binding="webHttpBinding" contract="AssayControl_Web.AssayControlWS" bindingName="AssayControl_Web.AssayControlWS" />
        </service>

<behaviors>
    <endpointBehaviors>
        <serviceBehaviors>
          <behavior name="metadataAndDebug">
            <serviceMetadata  httpGetEnabled="true" httpGetUrl=""/>
              <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" />
          </behavior>
       </serviceBehaviors>
    </endpointBehaviors>
</behaviors>


<webHttpBinding>
            <binding name="AssayControl_Web.AssayControlWS" maxBufferSize="200000000"
                maxBufferPoolSize="200000000" maxReceivedMessageSize="200000000"
                transferMode="Buffered" />
</webHttpBinding>

この 400 エラーの原因について何か考えはありますか?

=================== 解決した問題 ============================= ==

WCF ロギングを追加した後、Web サービスが maxReceivedMessageSize にデフォルト値の 65536 を使用していたことが問題であることがわかりました。これは、この値をはるかに高い値に設定したにもかかわらずです。

さらに検索すると、他の何人かの人々が maxReceivedMessageSize が無視されるという問題に遭遇したことがわかりました。私がこの問題を修正した方法は、webHttpBinding から Name プロパティを削除し、その設定をすべての webHttpBinding のデフォルトにすることでした。次に、サービス エンドポイントから BindingName プロパティを削除して、既定のバインドを使用するようにします。

同じ修正を含むこの問題の他のレポートへのリンクは次のとおりです。 -webconfig-ignored . おそらくこれは、.net 4.0 以降で使用される新しい単純化されたバインディング メソッドと関係があります。

4

0 に答える 0