亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# WebApi CORS跨域問題解決方案

2019-10-29 19:59:38
字體:
來源:轉載
供稿:網友

前言:上篇總結了下WebApi的接口測試工具的使用,這篇接著來看看WebAPI的另一個常見問題:跨域問題。本篇主要從實例的角度分享下CORS解決跨域問題一些細節。

一、跨域問題的由來

同源策略:出于安全考慮,瀏覽器會限制腳本中發起的跨站請求,瀏覽器要求JavaScript或Cookie只能訪問同域下的內容。

正是由于這個原因,我們不同項目之間的調用就會被瀏覽器阻止。比如我們最常見的場景:WebApi作為數據服務層,它是一個單獨的項目,我們的MVC項目作為Web的顯示層,這個時候我們的MVC里面就需要調用WebApi里面的接口取數據展現在頁面上。因為我們的WebApi和MVC是兩個不同的項目,所以運行起來之后就存在上面說的跨域的問題。

二、跨域問題解決原理

CORS全稱Cross-Origin Resource Sharing,中文全稱跨域資源共享。它解決跨域問題的原理是通過向http的請求報文和響應報文里面加入相應的標識告訴瀏覽器它能訪問哪些域名的請求。比如我們向響應報文里面增加這個Access-Control-Allow-Origin:http://localhost:8081,就表示支持http://localhost:8081里面的所有請求訪問系統資源。其他更多的應用我們就不一一列舉,可以去網上找找。

三、跨域問題解決細節

下面我就結合一個簡單的實例來說明下如何使用CORS解決WebApi的跨域問題。

1、場景描述

我們新建兩個項目,一個WebApi項目(下圖中WebApiCORS),一個MVC項目(下圖中Web)。WebApi項目負責提供接口服務,MVC項目負責頁面呈現。如下:

C#,WebApi,CORS,跨域

其中,Web與WebApiCORS端口號分別為“27239”和“27221”。Web項目需要從WebApiCORSS項目里面取數據,很顯然,兩個項目端口不同,所以并不同源,如果使用常規的調用方法肯定存在一個跨域的問題。

簡單介紹下測試代碼,Web里面有一個HomeController

public class HomeController : Controller  {    // GET: Home    public ActionResult Index()    {      return View();    }  }

對應的Index.cshtml

<html><head>  <meta name="viewport" content="width=device-width" />  <title>Index</title>  <script src="~/Content/jquery-1.9.1.js"></script>  <link href="~/Content/bootstrap/css/bootstrap.css" rel="external nofollow" rel="stylesheet" />  <script src="~/Content/bootstrap/js/bootstrap.js"></script>  <script src="~/Scripts/Home/Index.js"></script></head><body>  測試結果:<div id="div_test">   </div></body></html>

Index.js文件

var ApiUrl = "http://localhost:27221/";$(function () {  $.ajax({    type: "get",    url: ApiUrl + "api/Charging/GetAllChargingData",    data: {},    success: function (data, status) {      if (status == "success") {        $("#div_test").html(data);      }    },    error: function (e) {      $("#div_test").html("Error");    },    complete: function () {    }  });});

WebApiCORS項目里面有一個測試的WebApi服務ChargingController

public class ChargingController : ApiController  {    /// <summary>    /// 得到所有數據    /// </summary>    /// <returns>返回數據</returns>    [HttpGet]    public string GetAllChargingData()    {      return "Success";    }  }

配置WebApi的路由規則為通過action調用。WebApiConfig.cs文件

public static class WebApiConfig  {    public static void Register(HttpConfiguration config)    {      // Web API 路由      config.MapHttpAttributeRoutes();      config.Routes.MapHttpRoute(        name: "DefaultApi",        routeTemplate: "api/{controller}/{action}/{id}",        defaults: new { id = RouteParameter.Optional }      );    }  }

2、場景測試

1)我們不做任何的處理,直接將兩個項目運行起來??葱Ч绾?/p>

IE瀏覽器:

C#,WebApi,CORS,跨域

谷歌瀏覽器:

C#,WebApi,CORS,跨域

這個結果另博主也很吃驚,不做任何跨域處理,IE10、IE11竟然可以直接請求數據成功,而同樣的代碼IE8、IE9、谷歌瀏覽器卻不能跨域訪問。此原因有待查找,應該是微軟動了什么手腳。

2)使用CORS跨域

首先介紹下CORS如何使用,在WebApiCORS項目上面使用Nuget搜索“microsoft.aspnet.webapi.cors”,安裝第一個

C#,WebApi,CORS,跨域

然后在App_Start文件夾下面的WebApiConfig.cs文件夾配置跨域

public static class WebApiConfig  {    public static void Register(HttpConfiguration config)    {      //跨域配置      config.EnableCors(new EnableCorsAttribute("*", "*", "*"));      // Web API 路由      config.MapHttpAttributeRoutes();      config.Routes.MapHttpRoute(        name: "DefaultApi",        routeTemplate: "api/{controller}/{action}/{id}",        defaults: new { id = RouteParameter.Optional }      );    }  }

我們暫定三個“*”號,當然,在項目中使用的時候一般需要指定對哪個域名可以跨域、跨域的操作有哪些等等。這個在下面介紹。

IE10、IE11

C#,WebApi,CORS,跨域

谷歌瀏覽器

C#,WebApi,CORS,跨域

IE8、IE9

C#,WebApi,CORS,跨域

這個時候又有新問題了,怎么回事呢?我都已經設置跨域了呀,怎么IE8、9還是不行呢?這個時候就有必要說說CORS的瀏覽器支持問題了。網上到處都能搜到這張圖:

C#,WebApi,CORS,跨域

上圖描述了CORS的瀏覽器支持情況,可以看到IE8、9是部分支持的。網上說的解決方案都是Internet Explorer 8、9使用 XDomainRequest對象實現CORS。是不是有這么復雜?于是博主各種百度尋找解決方案。最后發現在調用處指定jQuery.support.cors = true;這一句就能解決IE8、9的問題了。具體是在Index.js里面

jQuery.support.cors = true;var ApiUrl = "http://localhost:27221/";$(function () {  $.ajax({    type: "get",    url: ApiUrl + "api/Charging/GetAllChargingData",    data: {},    success: function (data, status) {      if (status == "success") {        $("#div_test").html(data);      }    },    error: function (e) {      $("#div_test").html("Error");    },    complete: function () {    }  });});

這句話的意思就是指定瀏覽器支持跨域。原來IE9以上版本的瀏覽器、谷歌、火狐等都默認支持跨域,而IE8、9卻默認不支持跨域,需要我們指定一下。你可以在你的瀏覽器里面打印jQuery.support.cors看看。這樣設置之后是否能解決問題呢?我們來看效果:

C#,WebApi,CORS,跨域

問題完美解決。至于網上說的CORS對IE8、9的解決方案XDomainRequest是怎么回事,有待實例驗證。

3)CORS的具體參數設置。

上文我們使用

config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

這一句解決了跨域問題,上面說了,這種*號是不安全的。因為它表示只要別人知道了你的請求url,任何請求都可以訪問到你的資源。這是相當危險的。所以需要我們做一些配置,限制訪問權限。比如我們比較常見的做法如下:

配置方法一、在Web.Config里面

C#,WebApi,CORS,跨域

然后在WebApiConfig.cs文件的Register方法里面

C#,WebApi,CORS,跨域

配置方法二、如果你只想對某一些api做跨域,可以直接在API的類上面使用特性標注即可。

[EnableCors(origins: "http://localhost:8081/", headers: "*", methods: "GET,POST,PUT,DELETE")]  public class ChargingController : ApiController  {    /// <summary>    /// 得到所有數據    /// </summary>    /// <returns>返回數據</returns>    [HttpGet]    public string GetAllChargingData()    {      return "Success";    }  }

四、總結

以上就是一個簡單的CORS解決WebApi跨域問題的實例,由于博主使用WebApi的時間并不長,所以很多理論觀點未必成熟,如果有說的不對的,歡迎指出。也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品第一页在线| 国产精品第10页| 91精品视频在线免费观看| 国产一区二区三区在线播放免费观看| 久久久久中文字幕2018| 97超级碰碰碰久久久| 亚洲性夜色噜噜噜7777| 亚洲成色777777女色窝| 国产精品久久久久久av下载红粉| 久久成人亚洲精品| 国产欧美日韩丝袜精品一区| 色哟哟亚洲精品一区二区| 亚洲精品第一国产综合精品| 亚洲女在线观看| 日韩禁在线播放| 亚洲最大av在线| 精品国产电影一区| 中文字幕国产亚洲2019| 91免费看视频.| 国语对白做受69| 久久精品国产久精国产一老狼| 久久久久亚洲精品国产| 亚洲视频电影图片偷拍一区| 国产成人精品久久二区二区91| 日韩av在线一区二区| 日韩精品在线观看视频| 亚洲欧美成人网| 在线播放国产一区二区三区| 亚洲一区二区三区成人在线视频精品| 国产欧亚日韩视频| 欧美性高跟鞋xxxxhd| 亚洲精品一区中文| 亚洲经典中文字幕| 69视频在线播放| 最好看的2019的中文字幕视频| 亚洲国产精品成人一区二区| 亚洲色图15p| 国产午夜精品一区二区三区| 在线观看中文字幕亚洲| 欧美激情视频给我| 美女福利精品视频| 欧美亚洲激情在线| 亚洲xxx自由成熟| 亚洲图中文字幕| 国产视频欧美视频| 久久国产加勒比精品无码| 国产区精品在线观看| 国产精品白嫩美女在线观看| 欧美视频免费在线观看| 亚洲精品白浆高清久久久久久| 久久99亚洲精品| 91超碰中文字幕久久精品| 色偷偷噜噜噜亚洲男人的天堂| 欧美国产日韩精品| 欧美在线视频观看免费网站| 精品国产福利视频| 精品国产自在精品国产浪潮| 91视频-88av| 欧美精品videofree1080p| 亚洲欧美激情四射在线日| 亚洲欧美福利视频| 国产一区二区三区网站| 久久久久久久久久婷婷| 欧美做受高潮电影o| 在线播放精品一区二区三区| 中文字幕精品久久久久| 永久555www成人免费| 91在线高清免费观看| 亚洲视频999| 国产精品极品尤物在线观看| 亚洲欧美另类自拍| 91高清视频免费| 精品视频久久久| 97精品伊人久久久大香线蕉| 亚洲视频在线观看视频| 久久久亚洲福利精品午夜| 精品久久久久久久久久国产| 日韩欧美在线视频观看| 欧美亚洲第一页| 国产亚洲欧美一区| 亚洲香蕉成人av网站在线观看| 色综合亚洲精品激情狠狠| 久久亚洲私人国产精品va| 成人在线免费观看视视频| 亚洲人成在线免费观看| 麻豆乱码国产一区二区三区| 欧美亚洲成人网| 欧美激情在线观看视频| 久久激情视频免费观看| 久久久成人av| 亚洲精品suv精品一区二区| 疯狂蹂躏欧美一区二区精品| 国产91在线高潮白浆在线观看| 丰满岳妇乱一区二区三区| 国产精品丝袜高跟| 欧美国产日韩一区二区| 久久精品男人天堂| 97视频免费观看| 欧美日韩亚洲视频| 亚洲偷熟乱区亚洲香蕉av| 国外视频精品毛片| 亚洲大胆美女视频| 欧美大尺度在线观看| 国产精品视频永久免费播放| 啪一啪鲁一鲁2019在线视频| 日韩免费在线看| 久久久久久久久久久久av| 国产精品88a∨| 大胆人体色综合| 这里只有精品久久| 国产成人精品网站| 亚洲欧美成人一区二区在线电影| 日韩精品福利在线| 亚洲人成在线观| 最近中文字幕mv在线一区二区三区四区| 国产精品pans私拍| 亚洲精品中文字幕有码专区| 欧美国产在线视频| 奇米影视亚洲狠狠色| 亚洲天堂成人在线| 日韩在线视频二区| 日韩国产精品视频| 92裸体在线视频网站| 91免费精品国偷自产在线| 亚洲自拍偷拍区| 国产精品久久久久久久久免费看| www国产精品com| 波霸ol色综合久久| 国产精品久久久久久久7电影| 成人精品网站在线观看| 色妞在线综合亚洲欧美| 亚洲精品色婷婷福利天堂| 国产精品福利网| 亚洲国产欧美一区二区三区同亚洲| 一区二区福利视频| 国产精品免费观看在线| 国产精品999999| 欧美成人免费全部| 国产一区二区三区在线视频| 91在线观看免费高清| 国模精品视频一区二区三区| 国产激情999| 久久免费视频网| 奇米四色中文综合久久| 庆余年2免费日韩剧观看大牛| 久久人人爽人人爽爽久久| 久久久久久91| 欧美裸体xxxx极品少妇软件| 国产成人精品电影| 国产精品夫妻激情| 亚洲天堂av高清| 欧美成人合集magnet| 8x海外华人永久免费日韩内陆视频| 欧美激情亚洲激情| 亚洲成人黄色网址| www.亚洲成人| 久久91精品国产91久久久| 国产精品久久久久久久av电影| 在线成人激情黄色| 国产日韩欧美电影在线观看| 亚洲午夜av久久乱码| 福利一区视频在线观看| 精品无人区太爽高潮在线播放| 国产精品偷伦免费视频观看的|