3

MVC4 Web API アプリケーションへの ajax 呼び出しを行う MVC4 Web アプリケーションのクロスブラウザー、クロスドメイン サポートを実装するソリューションの一部として、IE によるクロスドメイン ajax 呼び出しのサポートを提供するためにXDomainRequestオブジェクトを使用しています < 10 クライアント。

Web API 側で逆シリアル化されると予想される要求本文に JSON を含む POST 操作に問題があります。

XDomainRequest を使用して IE < 10 から呼び出しを行う場合、リクエストのコンテンツ タイプとして明示的に指定することはapplication/jsonできません (XDomainRequest を使用する場合はヘッダーを変更できないため)。メソッド シグネチャで指定された型。

クロスドメイン GET 操作はすべてのブラウザーで正常に機能するため、Web API を CORS 用に適切に構成していることに注意してください。

Web API で定義された次の POST 操作を検討してください。

public int Customer(Customer customer) {}

CustomerJSON として表されるオブジェクトがリクエストの本文に存在する場合でも、呼び出しが IE < 10 を使用して XDomainRequest を使用して行われる場合customerは常にnullです。これは、XDomainRequest によって生成されたリクエストにcontent-type: application/jsonリクエスト ヘッダーがないために発生します。

リクエストでコンテンツ タイプが指定されていない場合でも、JSON 本体を強制的に適切に逆シリアル化できるように、Web API 側でこれを処理する方法はありますか?

モデルバインダーについて読んだことがありますが、これが意図されているかどうかは不明です。

参照用の XDomainRequest コードを次に示します (これは、IE < 10 を除くすべてのブラウザーで jQuery.ajax を使用する関数の一部です)。

var xdr = new XDomainRequest();
if (xdr) {
    xdr.open(method, url);
    xdr.onload = function() {
        var result = $.parseJSON(xdr.responseText);
        if (result == null || typeof(result) == 'undefined') {
            result = $.parseJSON(data.firstChild.textContent);
        }
        doneCallback(result);
    };
    xdr.onerror = function() {
        failCallback();
    };
    xdr.onprogress = function() {
    };
    xdr.send(data);
}
4

3 に答える 3

3

まだ存在しない場合は、着信要求コンテンツのcontent-typeヘッダーをapplication/jsonに設定する委任メッセージハンドラーを作成できます。

于 2012-11-20T18:40:05.150 に答える
3

キランの答えに基づいて、次のハンドラーを作成しました。

protected override Task<HttpResponseMessage> SendAsync(
    HttpRequestMessage request, CancellationToken cancellationToken)
{
    if (request.Method == HttpMethod.Post && request.Content.Headers.ContentType == null)
    {
        request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    }

    return base.SendAsync(request, cancellationToken);
}
于 2012-11-20T19:07:14.950 に答える
0

XDomainRequest の contentType プロパティは読み取り専用であるため、Kiran が提案することはできません。

http://msdn.microsoft.com/en-us/library/ie/cc288107%28v=vs.85%29.aspx

于 2013-02-17T01:31:38.890 に答える