使用 CORS 和 IE9 的 ASP Web API POST 请求(XDomainRequest 对象)

2024-02-01

我一直在疯狂地尝试让 jquery.ajax 与 ie9 一起工作。所以我有一个实现 CORS 的 ASP Web API 2 Rest API。来自所有浏览器的 CORS 请求都有效。 IE9 无法工作,因为它使用 XDomainRequest。我通过为 IE9 定制 ajaxTransport 的实现,成功地让它工作起来。

现在 GET 请求似乎工作正常。但是当我从 IE9 发出 post 请求时,我收到 HTTP 错误 415 - 不支持的媒体类型。

我已将内容类型设置为:“application/json”,并且还尝试了“application/x-www-form-urlencoded”,但据我了解,XDomainRequest 不支持所有带有自定义标头的内容?有谁知道是否需要在 WebAPI 上设置某些特定内容,或者我是否需要调整请求?

我的请求如下所示:

                        $.ajax({
                        url: hostname + "/api/DDC/Book",
                        type: "POST",

                        contentType: "application/json",
                        data: {
                            DealID: function () {
                                return viewModel.get("DealID");
                            },
                            LocationID: function () {
                                return viewModel.get("LocationID");
                            },
                            Time: function () {
                                return viewModel.get("selectedDateTime.Time");
                            }

                        }
                    })

在服务器上我有这个:

[HttpPost("DDC/Book")]
    [EnableCors(origins: "*", headers: "*", methods: "POST, GET, OPTIONS, PUT, DELETE")]
    public dynamic Post(BookModel model)
    {
       .........

当我在 IE 调试器中分析失败的请求时,这是发送出去的请求标头:

Key Value
Request POST //api/DDC/Book HTTP/1.1
Accept  */*
Origin  http://myurl.com
Accept-Language hr-HR
Accept-Encoding gzip, deflate
User-Agent  Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Host    www.somehost.com
Content-Length  55
DNT 1
Connection  Keep-Alive
Cache-Control   no-cache

我真的在这里失去了所有希望,IE 让我发疯了(该死的微软:D),所以任何帮助或建议都非常感谢。

编辑:通过更多研究,我发现 WebAPI 需要一种内容类型才能工作,而 XDomainRequest 不会发送内容类型。因此,我看到的唯一解决方案是在未设置任何内容时调整我的 webapi 以具有默认内容类型。但还不知道该怎么做

EDIT2:通过将我所有的 POST 转换为 GET 来暂时破解我的方法,不知道这有多聪明,但我现在没有看到更大的问题,所以在我解决问题之前它会这样做


自己设法解决了。正如 Ray Nicholus 所指出的,当没有内容类型时,ASP Web API 默认为“application/octet-stream”内容类型。我需要默认值“application/x-www-form-urlencoded”。

我设法通过编写自己的简单消息处理程序来实现这一目标,该消息处理程序检查传入请求“Content-Type”,如果没有任何内容,则添加一个“application/x-www-form-urlencoded”。

这是代码:

public class DefaultContentTypeMessageHandler : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (request.Content.Headers.ContentType == null)
            request.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded");


        var response = await base.SendAsync(request, cancellationToken);


        return response;
    }

}

UPDATE:

正如 Robert Christ 在下面的评论中所写的那样,我为那些以前没有使用过消息处理程序的人扩展了一些答案:

对于那些乍一看不明白的人,DelegatingHandlers 允许您在请求/响应对象真正命中之前修改它们 WebAPI 框架内部结构。框架中确实没有其他内容 允许您在模型绑定之前修改传入请求,而无需 实际上正在编写自定义模型绑定程序(呃)。所以,在这里,你 可以嗅出空内容类型(这是由缺点保证的) 在 XDomainRequest 规范中),将其更新为 xml 或 json,然后您将 能够正确解析传入的请求。

编写消息处理程序后,您需要将其注册到 WebAPI。您可以在 WebApiConfig 类中执行此操作:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {

        config.MessageHandlers.Add(new DefaultContentTypeMessageHandler());
        // Rest of your code

     }
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CORS 和 IE9 的 ASP Web API POST 请求(XDomainRequest 对象) 的相关文章