找回密码
 会员注册
查看: 125|回复: 0

C# ASP.NET MVC 配置允许跨域访问

[复制链接]

1389

主题

5

回帖

496万

积分

管理员

积分
4962992
发表于 2024-2-29 08:17:04 | 显示全部楼层 |阅读模式

启用 ASP.NET Core 中的跨域请求 (CORS)  
ASP.NET Core 启用跨域请求 (CORS)

【注意:仅能限制ajax json请求,不能限制ajax jsonp请求,本地修改了host文件,配置了不同域名,已经反复测试证实。】
在 ASP.NET Web API 项目中使用 Cross Origin Resource Sharing(CORS),解决一些跨域域请求问题,可以直接用 Ajax 调用 Web API 接口

1、管理 NuGet 添加引用
     Microsoft.AspNet.Cors
     注:在OWIN 中需要引用的是 Microsoft.AspNet.WebApi.Cors

2、在 WebApiConfig 文件中添加可跨域方法配置

  1. using System.Linq;
  2. using System.Web.Http;
  3. using System.Web.Http.Cors;
  4. namespace WebApplication1
  5. {
  6. public static class WebApiConfig
  7. {
  8. public static void Register(HttpConfiguration config)
  9. {
  10. var allowOrigin = ConfigurationManager.AppSettings["cors:allowOrigin"];
  11. var allowHeaders = ConfigurationManager.AppSettings["cors:allowHeaders"];
  12. var allowMethods = ConfigurationManager.AppSettings["cors:allowMethods"];
  13. //config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
  14. config.EnableCors(new EnableCorsAttribute(allowOrigin, allowHeaders, allowMethods));
  15. config.MapHttpAttributeRoutes();
  16. config.Routes.MapHttpRoute(
  17. name: "DefaultApi",
  18. routeTemplate: "api/{controller}/{id}",
  19. defaults: new { id = RouteParameter.Optional }
  20. );
  21. }
  22. }
  23. }
复制代码

*****************************************************************************************************************
【注意:如果在 web api 项目中配置了如上信息,可以跨域请求到接口,但是不能返回数据,提示错误信息,考虑把web api 项目中的 web.config 文件中的 httpProtocol 节点删除掉】
*****************************************************************************************************************

********
********
********
********

web.config文件中的 system.webServer 节点下增加如下配置:

  1. <!--允许跨域 参考 开始-->
  2. <appSettings>
  3. <add key="cors:allowMethods" value="*" />
  4. <add key="cors:allowOrigin" value="*" />
  5. <add key="cors:allowHeaders" value="*" />
  6. </appSettings>
  7. <!--允许跨域 参考 结束-->
  8. <system.web>
  9. <authentication mode="None" />
  10. <compilation debug="true" targetFramework="4.5" />
  11. <httpRuntime targetFramework="4.5" />
  12. </system.web>
  13. <system.webServer>
  14. <!--允许跨域 开始-->
  15. <httpProtocol>
  16. <customHeaders>
  17. <add name="Access-Control-Allow-Origin" value="*" />
  18. <add name="Access-Control-Allow-Headers" value="Content-Type" />
  19. <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
  20. </customHeaders>
  21. </httpProtocol>
  22. <!--允许跨域 结束-->
  23. </system.webServer>
复制代码

指定站点允许跨域访问(基础类)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. namespace WebApplication1.App_Start
  7. {
  8. public class AllowOriginAttribute
  9. {
  10. public static void onExcute(ControllerContext context, string[] AllowSites)
  11. {
  12. var origin = context.HttpContext.Request.Headers["Origin"];
  13. Action action = () =>
  14. {
  15. context.HttpContext.Response.AppendHeader("Access-Control-Allow-Origin", origin);
  16. };
  17. if (AllowSites != null && AllowSites.Any())
  18. {
  19. if (AllowSites.Contains(origin))
  20. {
  21. action();
  22. }
  23. }
  24. }
  25. }
  26. public class ActionAllowOriginAttribute : ActionFilterAttribute
  27. {
  28. public string[] AllowSites { get; set; }
  29. public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
  30. {
  31. AllowOriginAttribute.onExcute(filterContext, AllowSites);
  32. base.OnActionExecuting(filterContext);
  33. }
  34. }
  35. public class ControllerAllowOriginAttribute : AuthorizeAttribute
  36. {
  37. public string[] AllowSites { get; set; }
  38. public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
  39. {
  40. AllowOriginAttribute.onExcute(filterContext, AllowSites);
  41. }
  42. }
  43. }
复制代码

 

 

 

指定Controller允许跨域访问

 

  1. [ControllerAllowOrigin(AllowSites = new string[] { "http://localhost:52559" })]
  2. public class CityController : Controller
  3. {}
复制代码

 

 

 

指定Action允许跨域访问

 

  1. [HttpPost]
  2. [ActionAllowOrigin(AllowSites = new string[] { "http://localhost:52559" })]
  3. public ActionResult addCity(string userName, string password)
  4. {
  5. var a = userName;
  6. var b = password;
  7. return Json(new
  8. {
  9. Code = 200,
  10. msg = "123",
  11. data = ""
  12. }, JsonRequestBehavior.AllowGet);
  13. }
复制代码


html页面

 

 

 

 

  1. @{
  2. Layout = null;
  3. }
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta name="viewport" content="width=device-width" />
  8. <title>IndexTest</title>
  9. <script src="~/Scripts/jquery-1.8.0.js"></script>
  10. <script type="text/javascript">
  11. function login() {
  12. $.ajax({
  13. //几个参数需要注意一下
  14. type: "POST",//方法类型
  15. dataType: "json",//预期服务器返回的数据类型
  16. url: "http://localhost:5640/City/addCity",//url
  17. data: $('#form1').serialize(),
  18. success: function (result) {
  19. console.log(result);//打印服务端返回的数据(调试用)
  20. if (result.Code == 200) {
  21. alert("SUCCESS");
  22. }
  23. },
  24. error: function () {
  25. alert("异常!");
  26. }
  27. });
  28. }
  29. </script>
  30. </head>
  31. <body>
  32. <form id="form1" onsubmit="return false" action="##" method="post">
  33. <p>用户名:<input name="userName" type="text" id="txtUserName" tabindex="1" size="15" value="" /></p>
  34. <p>密 码:<input name="password" type="password" id="TextBox2" tabindex="2" size="16" value="" /></p>
  35. <p><input type="button" value="登录" onclick="login()"> <input type="reset" value="重置"></p>
  36. </form>
  37. </body>
  38. </html>
复制代码

 

XMLHttpRequest(原生)

 

  1. function loginNew() {
  2. var barcode = document.getElementById("Barcode").value;
  3. var name = document.getElementById("Name").value;
  4. console.log("1:" + barcode + ";2:" + name);
  5. //创建异步对象
  6. var xmlhttp = new XMLHttpRequest();
  7. //设置请求的类型及url
  8. xmlhttp.open('post', 'http://localhost:52556/api/AssetOa?IsAddAsset=true', true);
  9. //post请求一定要添加请求头才行不然会报错
  10. //xmlhttp.setRequestHeader("Content-type", "application/json");
  11. xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  12. //发送请求
  13. xmlhttp.send('&Barcode=' + barcode + '&Name=' + name + '&AssetTypeId=1');
  14. xmlhttp.onreadystatechange = function () {
  15. // 这步为判断服务器是否正确响应
  16. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  17. console.log(xmlhttp.responseText);
  18. }
  19. };
  20. }
复制代码

 

 

 

D:\MyFile\测试项目\Solution1\WebApplication1


来源:https://blog.csdn.net/KingCruel/article/details/80229589
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-27 00:33 , Processed in 0.563074 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表