title: ASP.NET WebAPI允许跨域访问配置踩坑记
date: 2019-03-01 00:00:00
categories:

  • 后端
    tags:
  • ASP.NET
  • WebAPI
  • RESTful

没有设置服务端允许跨域访问之前

  1. API服务器地址http://localhost:17693/api/food
  2. 在本地新建一个HTML,采用jQuery Ajax获取跨域获取数据,结果如下:

ASP.NET WebAPI允许跨域访问配置踩坑记 - 图1

配置ASP.NET Web API允许跨域访问

  1. API所在项目使用NuGet安装Microsoft.AspNet.WebApi.Cors,打开vs的NuGet控制台,执行命令Install-Package Microsoft.AspNet.WebApi.Cors
  2. 修改WebApiConfig.cs文件的配置:在WebApiConfig类中添加方法EnableCrossSiteRequests,同时不要忘了将System.Web.Http.Cors命名空间引入。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web.Http;
  5. using System.Web.Http.Cors;
  6. namespace WebAPI_Swagger
  7. {
  8. public static class WebApiConfig
  9. {
  10. public static void Register(HttpConfiguration config)
  11. {
  12. config.Routes.MapHttpRoute(
  13. name: "DefaultApi",
  14. routeTemplate: "api/{controller}/{id}",
  15. defaults: new { id = RouteParameter.Optional }
  16. );
  17. }
  18. private static void EnableCrossSiteRequests(HttpConfiguration config)
  19. {
  20. //对所有的请求来源没有任何限制
  21. var cors = new EnableCorsAttribute(
  22. origins: "*",
  23. headers: "*",
  24. methods: "*"
  25. );
  26. config.EnableCors(cors);
  27. }
  28. }
  29. }
  1. 在项目的Web.config文件中的system.webServer节点下添加:```c
    1. <customHeaders>
    2. <add name="Access-Control-Allow-Origin" value="*" />
    3. <add name="Access-Control-Allow-Headers" value="*" />
    4. <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE" />
    5. </customHeaders>
    ```
  1. 4. 重新编译调试项目,出现错误`安全透明方法“System.Web.Http.GlobalConfiguration.get_Configuration()”尝试访问安全关键类型“System.Web.Http.HttpConfiguration”失败。`
  2. [![](https://images.fengjiaheng.top/images/20180429/02.png)](https://images.fengjiaheng.top/images/20180429/02.png)
  3. 5. 错误原因:system.web.http.webhost的版本低引起,system.web.http.webhost的版本是4.0.0.0,需要安装一个高版本的web api
  4. 6. 使用NuGet安装`Microsoft ASP.NET Web API 2.2`
  5. `Install-Package Microsoft.AspNet.WebApi -Version 5.2.4`
  6. 7. 重新生成解决方案,再次调试成功。
  7. 8. 测试允许跨域访问是否成功
  8. 9. 编写HTML文件:
  9. ``` C#
  10. <!DOCTYPE html>
  11. <html lang="en">
  12. <head>
  13. <meta charset="UTF-8">
  14. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  15. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  16. <title>Document</title>
  17. <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
  18. <script>
  19. $.ajax({
  20. url: "http://localhost:17693/api/food",//Food就是控制器的名字
  21. type: "Get",
  22. success: function (obj)
  23. {
  24. var str = "";
  25. str += "<table><tr><td>食物名:</td></tr>";
  26. for (var i = 0; i < obj.length; i++)
  27. {
  28. str += "<tr><td>"+obj[i].FName+"</td></tr>";
  29. }
  30. str += "</table>";
  31. $("#DivFood").html(str);
  32. }
  33. })
  34. </script>
  35. </head>
  36. <body>
  37. <div>
  38. <div id="DivFood"></div>
  39. </div>
  40. </body>
  41. </html>
  1. 成功访问 ASP.NET WebAPI允许跨域访问配置踩坑记 - 图2 ```