XDomainRequest json POST 正文未在 ASP.NET Web API 调用中反序列化



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

我在执行 POST 操作时遇到问题,这些操作在请求正文中包含 JSON,我希望在 Web API 端对其进行反序列化。

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

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

请考虑在 Web API 上定义的以下 POST 操作:

public int Customer(Customer customer) {}

即使请求正文中存在表示为 JSON 的Customer,当使用 IE <10 使用 XDomainRequest 进行调用时,customer始终null。发生这种情况是因为 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);
}

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

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

您无法按照 Kiran 的建议进行操作,因为 XDomainRequest 的 contentType 属性是只读的。

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

最新更新