1. 程式人生 > >ASP.NET MVC中設置跨域

ASP.NET MVC中設置跨域

pan 探索 on() content current lte exce 響應 att

ASP.NET MVC中設置跨域

1、什麽是跨域請求

js禁止向不是當前域名的網站發起一次ajax請求,即使成功respone了數據,但是你的js仍然會報錯。這是JS的同源策略限制,JS控制的並不是我們網站編程出現了問題。客戶端(網頁)和後臺編程都可以有效解決這個問題。客戶端可以通過JSONP來完成跨域訪問;在ES6中為了解除同源策略問題,想出一個辦法:當被請求網站為響應頭respone添加了一個名為Access-Control-Allow-Origin的header,設置其值等於發起請求網站的域名地址的話,這次請求被視為允許。其中Access-Control-Allow-Origin的值為*

時表示允許所有網站的跨域請求。

本文主要探索如何在後臺代碼中設置允許跨域訪問。

2、在action中添加代碼

HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "*");

3、在webconfig添加應用程序配置:

<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="
Access-Control-Allow-Headers" value="Content-Type" /> <add name="Access-Control-Allow-Methods" value="*" /> </customHeaders> </httpProtocol> </system.webServer>

4、添加action過濾器

不論webapi還是mvc的action,我們都可以重寫ActionFilterAttribute過濾器的OnException方法來在action執行完成之後,為http響應添加header頭;OnException方法意為在action執行完成之後進行的操作。這個過濾器可以添加在action或者controller上,但是這樣就要為每一個action或者controller打上這個過濾器,這裏將我們重寫的action過濾器添加在了全局的過濾器中,這樣,每一個action在執行完成之後都會觸發這個過濾器,這裏以webapi為例。新建類:

    /// <summary>
    /// 跨域
    /// </summary>
    public class Cores:ActionFilterAttribute
    {
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            base.OnActionExecuted(actionExecutedContext);
            actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin","*");
        }
    }

在webapiconfig中添加。

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服務
            // 將 Web API 配置為僅使用不記名令牌身份驗證。
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API 路由
            config.MapHttpAttributeRoutes();
            config.Filters.Add(new Cores());
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

ASP.NET MVC中設置跨域