• Angular2中对ASP.NET MVC跨域访问


    • 应用场景

      项目开发决定使用angular2进行前后端分离开发,由我负责后端服务的开发,起初选择的是web api进行开发。对跨域访问通过API中间件+过滤器对跨域访问进行支持。开发一段后,通知需要移植到MVC4项目中一同发布angular2并且放弃API,但前期开发仍然需要分离开发。

    • 遇到的问题

      想继续使用中间件和过滤器的方式对MVC中的Action进行操作和限制,但经过尝试后发现行不通。主要问题有几下几点。

    1. API的处理管道和MVC的处理管道是两个完全不同的东西,所以原来用于API中的编码和方法不能复用。
    2. 需要采用其他方式解决javascript跨域请求中的OPTIONS请求问题。(资料显示javascript出于安全考虑,并不允许跨域请求。)
    • 解决方法和步骤

    •   处理HTTP response header 中关于跨域的内容,我采用的是在web.config中 <system.webServer> 内添加如下内容。

    1     <httpProtocol>
    2         <customHeaders>
    3             <add name="Access-Control-Allow-Origin" value="*" />
    4             <add name="Access-Control-Allow-Headers" value="Content-Type" />
    5             <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    6         </customHeaders>
    7     </httpProtocol>

     (其他headers的值:Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With, Authorizatio)

    (请根据实际需要进行增减!)

    •   处理http request zhong options 请求的内容

    在跨域请求时会先触发一次options请求,根据response的header中内容以及返回状态,确定是否要进行正式的GET、POST等请求。但是在实际开发中我们不可能对action进行重复标记处理http的请求特性(attribute)。

    1         [HttpOptions]
    2         [HttpPost]
    3         public ActionResult Index()
    4         {
    5             return View();
    6         }

    我的处理办法是在Global.asax中对所有options请求人为通过。来告诉client可以正常请求。

     1         void Application_EndRequest()
     2         {
     3             if (this.Request.HttpMethod.ToUpper().Equals("OPTIONS"))
     4             {
     5                 this.Response.Status = "200 OK";
     6                 this.Response.StatusCode = 200;
     7                 this.Response.StatusDescription = "OK";
     8                 this.Response.SubStatusCode = 200;
     9             }
    10         }
    • 请求过程图片

    一个GET请求,跨域操作下会进行两次请求,一次OPTIONS、一次GET。其中GET请求的执行正像前边提到的,会根据OPTIONS请求的状态而触发。

    • 参考内容

    1. 《ASP.NET MVC5框架揭秘》   Artech     的书籍
    2. 《解决asp.net mvc的跨域请求问题》   Mr.XYZ   的博文
  • 相关阅读:
    构造函数+this关键字+super关键字
    封装
    数组+方法
    流程控制语句
    java运算符+引用数据类型
    java的基础安装
    mysql数据库连接
    mysql数据库约束
    mysql数据库
    练习010:按奇偶排序数组
  • 原文地址:https://www.cnblogs.com/cnlizhipeng/p/MVC_Angular2_Cross.html
Copyright © 2020-2023  润新知