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 以降で使用される新しい単純化されたバインディング メソッドと関係があります。