3

感谢您的关注!

背景

我正在为一家公司编写一个 API 层,供不同的应用程序和外部消费者使用。

在消费端,大多数消费者会使用 jQuery 通过 ajax 调用服务$.post();然而,Internet Explorer 让我们的生活更具挑战性(当然!)。对于 IE,我必须使用该XDomainRequest对象,因为 IE 不会运行 jQuery $.post(),而且如果我使用 IE XMLHttpRequest(),我会收到一条不可接受的安全消息(再次——当然!):

在此处输入图像描述

否则,XMLHttpRequest()工作正常。

我正在使用 C#、.NET MVC 4 (WebApi)

问题

问题是XDomainRequest不允许您设置Content-Type标头,并且始终默认为text-plainMVC 4 WebApi 控制器将不接受的默认值(再一次 - 当然!!)。

问题

如何拦截对我的控制器的请求,检测text-plain内容类型的存在并将它们动态更改为text-json内容类型?

提前致谢!

4

2 回答 2

4

两天后,在这个线程中倾注文档和阅读我已经能够完成这项工作。所以如果我对解决方案的描述很差,请原谅我;这是我第一次回答这些类型的线程之一。因为我花了很长时间才找到问题,所以我认为值得拯救一些灵魂免于陷入同样的​​问题。

我的帮助来源来自byterot的上述链接。

  1. 我做的第一件事是创建一个DelegatingHandler。因此,在我的帮助文件夹或每个您想要创建一个类并将其命名为您想要的名称的地方。
    这是我的:

    public class ContentTypeHandler : DelegatingHandler
    {
        /** Check that this is an IE browser. */
        if ((request.Headers.UserAgent.ToString().IndexOf("MSIE", System.StringComparison.Ordinal) > -1))
        {
            MediaTypeHeaderValue contentTypeValue;
            if (MediaTypeHeaderValue.TryParse("application/json", out contentTypeValue))
            {
                request.Content.Headers.ContentType = contentTypeValue;
                request.Content.Headers.ContentType.CharSet = "utf-8";
            }
        }
    
        /** Return request to flow. */
        return base.SendAsync(request, cancellationToken)
           .ContinueWith(task =>
           {
                // work on the response
                var response = task.Result;
                return response;
           });
    }
    
  2. 最后认为你必须做的是在你的Global.asax.cs文件中调用处理程序Application_Start()

    GlobalConfiguration.Configuration.MessageHandlers.Add(new ContentTypeHandler());
    

这就是我所做的一切,它奏效了。祝你好运,我希望这对某人有所帮助。

于 2013-04-26T05:01:54.347 回答
3

在 HTTP 堆栈中修改请求没有问题。它可以通过DelegatingHandler在到达控制器之前编写和注册您的自定义来完成。委托处理程序可以在游戏的早期处理此问题,因此您的请求将以您想要的形式到达控制器。它也可以是特定于路由的处理程序。 http://msdn.microsoft.com/en-us/library/system.net.http.delegatinghandler.aspx

您是否尝试过 $.ajax 而不是 $.post ?

于 2013-01-16T20:26:22.963 回答