ASP.NET Web API自身對CORS的支持:從實例開始

来源:http://www.cnblogs.com/liuhui12/archive/2017/02/22/6431294.html
-Advertisement-
Play Games

在《通過擴展讓ASP.NET Web API支持W3C的CORS規範》中我們通過自定義的HttpMessageHandler為ASP.NET Web API賦予了跨域資源共用的能力,具體來講,這個自定義的CorsMessageHandler的自由主要體現在如下兩個方面:其一,為簡單跨域請求的響應和繼 ...


在《通過擴展讓ASP.NET Web API支持W3C的CORS規範》中我們通過自定義的HttpMessageHandler為ASP.NET Web API賦予了跨域資源共用的能力,具體來講,這個自定義的CorsMessageHandler的自由主要體現在如下兩個方面:其一,為簡單跨域請求的響應和繼預檢請求後的真實跨域資源請求的響應添加CORS報頭;其二,對從瀏覽器發送的預檢請求予以響應。實際上ASP.NET Web API本身就提供了針對CORS的支持,就其實現原理來看,與我們的實現沒有本質的區別。接下來我們通過實例演示如何利用ASP.NET Web API自身的支持來實現“跨域資源共用”。

如圖右圖所示,我們利用Visual Studio在同一個解決方案中創建了兩個Web應用。從項目名稱可以看出,WebApi和MvcApp分別為ASP.NET Web API和MVC應用,後者是Web API的調用者。我們直接採用預設的IIS Express作為兩個應用的宿主,並且固定了埠號:WebApi和MvcApp的埠號分別為“3721”和“9527”,所以指向兩個應用的URI肯定不可能是同源的。

ASP.NET Web API對CORS提供的原生支持實現在一個名為“Microsoft ASP.NET Web API 2 Cross-Origin Support”的NuGet包中。我們依然沿用上面這個通過跨域Ajax請求獲取聯繫人列表的這個例子,我們右鍵選種WebApi項目併在上下文菜單中選擇“管理NuGet包(Manage NuGet Package)”,在彈出的如左圖所示的對話框中,我們輸入“CORS”作為查詢條件後會看到這個NuGet包頭。

當我們安裝這個包之後,現有的packages目錄下會添加兩個名稱分別為“Microsoft.AspNet.Cors.5.0.0”和“Microsoft.AspNet.WebApi.Cors.5.0.0”,針對保存其中的兩個程式集(System.Web.Cors.dll和System.Web.Http.Cors.dll)的引用被自動添加到WebApi項目中。

ASP.NET針對CORS的實現就實現在程式集System.Web.Cors.dll中,另一個程式集System.Web.Http.Cors.dll自然就是針對ASP.NET Web API的。在預設情況下,針對CORS的支持是關閉的,我們需要在Global.asax中按照如下的方式調用當前HttpConfiguration的擴展方法EnableCors顯示開啟針對CORS的支持。

   1: public class WebApiApplication : System.Web.HttpApplication
   2: {
   3:     protected void Application_Start()
   4:     {
   5:         GlobalConfiguration.Configuration.EnableCors();
   6:         //其他操作
   7:     }
   8: }

和在《通過擴展讓ASP.NET Web API支持W3C的CORS規範》實現CORS的實例一樣,ASP.NET Web API自身也是藉助於應用在HttpController類型或者定義其中的Action方法的特性來定義CORS授權策略的,這個特性類型為System.Web.Http.Cors.EnableCorsAttribute,它定義在程式集System.Web.Http.Cors.dll中。我們只需要按照如下的方式將EnableCorsAttribute特性應用到定義在ContactsController中的Action方法GetAllContacts上即可。

   1: [EnableCors(origins: "http://localhost:9527", headers: "*", methods: "*")]
   2: public class ContactsController : ApiController
   3: {
   4:     public IHttpActionResult GetAllContacts()
   5:     {
   6:         Contact[] contacts = new Contact[]
   7:         {
   8:             new Contact{ Name="張三", PhoneNo="123", EmailAddress="[email protected]"},
   9:             new Contact{ Name="李四", PhoneNo="456", EmailAddress="[email protected]"},
  10:             new Contact{ Name="王五", PhoneNo="789",EmailAddress="[email protected]"},
  11:         };
  12:         return Json<IEnumerable<Contact>>(contacts);
  13:     }
  14: }
  15:  
  16: public class Contact
  17: {
  18:     public string Name { get; set; }
  19:     public string PhoneNo { get; set; }
  20:     public string EmailAddress { get; set; }
  21: }

如上面的代碼片斷所示,我們為應用的EnableCorsAttribute特性指定了三個參數。根據參數名稱和上面我們針對W3C的CORS規範的介紹,我們應該可以猜得到它們分別代表:授權的源站點,和請求所允許的自定義包頭和HTTP方法。我們將客戶端ASP.NET MVC應用所在的站點“http://localhost:9527”設置為授權的源站點,後兩者則直接設置為“*”表示對此不作任何限制。

接下來們在MvcApp應用中定義如下一個HomeController,預設的Action方法Index會將對應的View呈現出來。

   1: public class HomeController : Controller
   2: {
   3:     public ActionResult Index()
   4:     {
   5:         return View();
   6:     }
   7: }

如下所示的是Action方法Index對應View的定義。我們的目的在於:當頁面成功載入之後以Ajax請求的形式調用上面定義的Web API獲取聯繫人列表,並將自呈現在頁面上。如下麵的代碼片斷所示,Ajax調用和返回數據的呈現是通過調用jQuery的getJSON方法完成的。

   1: <html>
   2: <head>
   3:     <title>聯繫人列表</title>
   4:     <script type="text/javascript" src="@Url.Content("~/scripts/jquery-1.10.2.js")"></script>
   1:  
   
   2: </head>
   
   3: <body>
   
   4:     <ul id="contacts"></ul>
   
   5:     <script type="text/javascript">
   
   6:         $(function ()
   
   7:         {
   
   8:             var url = "http://localhost:3721/api/contacts";
   
   9:             $.getJSON(url, null, function (contacts) {
   
  10:                 $.each(contacts, function (index, contact)
   
  11:                 {
   
  12:                     var html = "<li><ul>";
   
  13:                     html += "<li>Name: " + contact.Name + "</li>";
   
  14:                     html += "<li>Phone No:" + contact.PhoneNo + "</li>";
   
  15:                     html += "<li>Email Address: " + contact.EmailAddress + "</li>";
   
  16:                     html += "</ul>";
   
  17:                     $("#contacts").append($(html));
   
  18:                 });
   
  19:             });
   
  20:         });
   
  21:     
             </script>
   5: </body>
   6: </html>

現在運行我們的ASP.NET MVC程式,依然可以得到如右圖所示的輸出結果。從編程的角度來講,ASP.NET Web API針對CORS的實現僅僅涉及到兩個方面:

  • 其一,HttpConfiguration的擴展方法EnableCors,它用於開啟ASP.NET Web API針對CORS的支持;
  • 其二,EnableCorsAttribute特性,它為目標HttpController或者Action方法定義CORS授權策略。

但是整個CORS體系不限於此,在它們背後隱藏著一系列的類型,我們將會利用後續的文章對此作全面講述。

CORS系列文章
[1] 同源策略與JSONP
[2] 利用擴展讓ASP.NET Web API支持JSONP
[3] W3C的CORS規範
[4] 利用擴展讓ASP.NET Web API支持CORS
[5] ASP.NET Web API自身對CORS的支持: 從實例開始
[6] ASP.NET Web API自身對CORS的支持: CORS授權策略的定義和提供
[7] ASP.NET Web API自身對CORS的支持: CORS授權檢驗的實施
[8] ASP.NET Web API自身對CORS的支持: CorsMessageHandler

參考頁面:http://qingqingquege.cnblogs.com/p/5933752.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DbContext、DbSet及DbQuery是Entity Framework Code First引入的3個新的類,其中DbContext用於保持資料庫會話連接,實體變化跟蹤及保存,DbSet用於暫存實體類的變化跟蹤,DbQuery用於提供查詢跟你。 1、使用Set查詢全部記錄 使用DbCont ...
  • 我最近幾天正在學習Entity Framework Code First.我打算分享一系列的學習筆記,今天是第一部分: 為什麼要使用Code First: 近年來,隨著domain driven design的推廣,以前那種先建好資料庫,然後再編寫代碼的方式受到了越來越多的質疑。因為使用這種開發方式 ...
  • WCF的服務需要寄宿在進程中,我們把服務端的叫做宿主,為服務指定宿主指定的過程叫服務寄宿。有兩種方式一種是自我寄宿(Self-Hosting),一種是IIS寄宿方式。Self-Hosting我們通過一個控制台應用作為服務的宿主,IIS我們將服務寄宿於IIS工作進程。客戶端通過另一個控制台應用模擬(進 ...
  • 0 Asp.Net Core 項目實戰之許可權管理系統(0) 無中生有 1 Asp.Net Core 項目實戰之許可權管理系統(1) 使用AdminLTE搭建前端 2 Asp.Net Core 項目實戰之許可權管理系統(2) 功能及實體設計 3 Asp.Net Core 項目實戰之許可權管理系統(3) 通過 ...
  • lambda In的用法: lambda表達式查詢沒有IN這個方法,可以變通一下,in查詢的數組是否包含在映射對象裡面的集合里: 如下代碼: SQL:select * from db where DepartmentID in(departmentIDs) lambda groupby的用法 計算各 ...
  • 一、控制反轉(IoC) ASP.NET Core在啟動以及後續針對每個請求的處理過程中的各個環節都需要相應的組件提供相應的服務,為了方便對這些組件進行定製,ASP.NET通過定義介面的方式對它們進行了“標準化”,我們將這些標準化的組件稱為服務,ASP.NET在內部專門維護了一個DI容器來提供所需的服 ...
  • 在上一篇博文WebAPI用法中說了一下Web API在MVC4中使用的樣例。但有些時候我們只是想使用Web API的功能,而不需要使用整個的MVC,這個時候就該拋開MVC4來新建項目了。 首先要新建一個asp.net空應用程式,在程式中添加引用System.Web.Http和System.Web.H ...
  • 《C#語言和資料庫技術基礎》第一章1..NET Framework 框架2.sharp 尖銳3.application 應用程式4.developer 開發者5.network 網路6.build 建造,建築7.console 控制台8.debug 調試9.namespace 命名空間10.proj ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...