3

作为实现跨浏览器、跨域支持 MVC4 Web 应用程序对 MVC4 Web api 应用程序进行 ajax 调用的解决方案的一部分,我使用XDomainRequest对象来为 IE 进行的跨域 ajax 调用提供支持 < 10个客户。

我在使用请求正文中包含 JSON 的 POST 操作时遇到问题,我希望在 Web api 端反序列化。

当使用 XDomainRequest 从 IE < 10 进行调用时,我无法明确指定application/json请求的内容类型(因为使用 XDomainRequest 时无法修改标头),因此 JSON 不会反序列化为方法签名中指定的类型。

请注意,跨域 GET 操作在所有浏览器中都可以正常工作,因此我为 CORS 等正确配置了我的 web api。

考虑在 web api 上定义的以下 POST 操作:

public int Customer(Customer customer) {}

即使在Customer请求正文中存在表示为 JSON 的对象时,customer总是null在使用 IE < 10 的 XDomainRequest 进行调用时。发生这种情况是因为 XDomainRequest 生成的请求缺少content-type: application/json请求标头。

有没有办法在 web api 端处理这个问题,以便即使请求中未指定内容类型,我也可以强制 JSON 正文正确反序列化?

我已经阅读了有关模型绑定器的信息,但不清楚这是否是它们的用途。

这是我的 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

您可以编写一个委托消息处理程序,在其中将传入请求内容的内容类型标头设置为 application/json(如果尚不存在)。

于 2012-11-20T18:40:05.150 回答
3

我根据 Kiran 的回答编写了以下处理程序:

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

你不能按照 Kiran 的建议去做,因为 XDomainRequest 的 contentType 属性是只读的。

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

于 2013-02-17T01:31:38.890 回答