微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 在.NET MVC 4(Web API)中,如何拦截控制器请求并更改其内容类型?

谢谢你的期待!

背景

我正在为不同的应用程序和外部消费者使用的公司编写API层.

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

否则,XMLHttpRequest()工作正常.

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

问题

问题是XDomainRequest不允许你设置Content-Type标头,并且总是认为text-plain MVC 4 WebApi控制器不接受(当然还是!!).

如何拦截对我的控制器的请求,检测文本内容类型的存在并将其更改为text-json内容类型?

提前致谢!

解决方法

好了两天之后,在文档和阅读这个帖子中,我已经能够完成这项工作了.如果我对解决方案的描述很差,请原谅我;这是我第一次回答这些类型的线程之一.由于我花了这么长时间才发现问题,我认为值得挽救一些灵魂不要陷入同样的​​问题.

我的帮助来源是byterot以上的链接.

>我做的第一件事就是创建一个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;
       });
}

>最后认为您必须在Application_Start()内的Global.asax.cs文件调用Handler:

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

这就是我所做的一切,并且有效.祝你好运,希望这对某人有所帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐