【问题标题】:XDomainRequest json POST body not being deserialized on ASP.NET Web API callsXDomainRequest json POST 正文未在 ASP.NET Web API 调用上反序列化
【发布时间】:2012-11-08 21:45:53
【问题描述】:

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

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

当使用 XDomainRequest 从 IE application/json 作为请求的内容类型(因为使用 XDomainRequest 时无法修改标头),因此 JSON 不是t 反序列化为方法签名中指定的类型。

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

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

public int Customer(Customer customer) {}

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

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

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

这是我的 XDomainRequest 代码供参考(仅供参考,这是对除 IE

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);
}

【问题讨论】:

    标签: jquery asp.net-web-api xdomainrequest


    【解决方案1】:

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

    【讨论】:

    • Kiran,处理程序是否保证在请求之前运行?在调试我实现的 CorsHandler 时,我发现在 IE 中它并没有在 web api 方法之前一直被命中。
    • 但我当然会尝试这个出色的建议并反馈
    • yeah..right..处理程序保证在参数绑定阶段(反序列化发生)之前运行...仅供参考:blogs.msdn.com/cfs-filesystemfile.ashx/__key/…
    【解决方案2】:

    我根据 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);
    }
    

    【讨论】:

    • 对于任何期望常规表单数据的人,您可以使用:request.Content.Headers.ContentType =MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded; charset=utf-8") ;
    【解决方案3】:

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

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

    【讨论】:

    • 是的,当您编写请求时。但是你可以在收到调用后使用委托处理程序做任何你想做的事情 - XDomainRequest 到那时就已经不在了。
    猜你喜欢
    • 1970-01-01
    • 2014-04-27
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多