CORS跨域请求C#版
2018-06-18 01:02:06来源:未知 阅读 ()
1、什么是跨域请求:
当从A网站使用AJAX请求B网站时,就会出现跨域请求。
此时B网站能够接收到A网站发来的请求并返回相应的结果,但是浏览器拿到B网站返回的数据时检测到与当前网站的域名不同,出于安全考虑浏览器不会把数据传递给A网站的这个AJAX请求。
2、如何解决跨域请求问题:
跨域问题到现在已经不是什么新鲜事情了,前辈们总结出来大致有以下几种方法:
CORS 、JSONP、flash、iframe、xhr2等等。
但是笔者最喜欢用CORS方法来解决该问题,因为该解决方案的原理非常简单,只需要由服务器发送一个响应头即可。
headers.Add("Access-Control-Allow-Origin", origin);
3、代码:
封装一个过滤器来处理Http请求
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.All, Inherited = true, AllowMultiple = true)] public class CorsAttribute : ActionFilterAttribute, IActionFilter { /// <summary> /// 构造函数 /// </summary> /// <param name="AllowOriginsPattern"></param> public CorsAttribute(string allowOriginsPattern = "") { if (string.IsNullOrEmpty(allowOriginsPattern)) { this.AllowOriginsPattern = ConfigurationManager.AppSettings["AllowOriginsPattern"].ToString(); } else { this.AllowOriginsPattern = allowOriginsPattern; } } /// <summary> /// 访问完成,追加head /// </summary> /// <param name="filterContext"></param> public override void OnResultExecuted(ResultExecutedContext filterContext) { try { base.OnResultExecuted(filterContext); GetResponse(); } catch (Exception exception) { HttpContext.Current.Response.Clear(); HttpContext.Current.Response.Write(exception.Message); HttpContext.Current.Response.End(); } } /// <summary> /// 允许的正则表达式 /// </summary> public string AllowOriginsPattern { get; set; } /// <summary> /// 获取response /// </summary> /// <returns></returns> public HttpResponse GetResponse() { HttpRequest request = HttpContext.Current.Request; IDictionary<string, string> headers; bool IsEvaluate = TryEvaluate(HttpContext.Current.Request, out headers); if (IsEvaluate) { foreach (var item in headers) { HttpContext.Current.Response.Headers.Add(item.Key, item.Value); } } return HttpContext.Current.Response; } /// <summary> /// 是否匹配 /// </summary> /// <param name="request"></param> /// <param name="headers"></param> /// <returns></returns> public bool TryEvaluate(HttpRequest request, out IDictionary<string, string> headers) { headers = null; if (request.Headers.GetValues("Origin") != null) { string origin = request.Headers.GetValues("Origin").First(); Regex regex = new Regex(AllowOriginsPattern, RegexOptions.IgnoreCase); if (regex.IsMatch(origin))//匹配正则 { headers = this.GenerateResponseHeaders(request); return true; } } return false; } /// <summary> /// 生成head /// </summary> /// <param name="request"></param> /// <returns></returns> private IDictionary<string, string> GenerateResponseHeaders(HttpRequest request) { string origin = request.Headers.GetValues("Origin").First(); Dictionary<string, string> headers = new Dictionary<string, string>(); headers.Add("Access-Control-Allow-Origin", origin); headers.Add("Access-Control-Allow-Headers", "x-requested-with,content-type,requesttype,Token"); headers.Add("Access-Control-Allow-Methods", "POST,GET"); return headers; } }
在接收跨域请求的方法上使用这个过滤器
[Cors(".*")]//这里的这个参数将允许任何网站请求 public JsonResult CorsApi() { return Json(new { data="跨域请求成功"},JsonRequestBehavior.AllowGet); }
也可通过在配置文件中添加 AllowOriginsPattern ,来控制可请求改方法的站点。此时方法上过滤器换成 [Cors]
<appSettings> <add key="AllowOriginsPattern" value="(http://)?(localhost:20735)"/> </appSettings>
4、当然如果是通过后台去请求其他网站的API是不存在跨域问题的
public ActionResult About() { HttpWebRequest http = (HttpWebRequest)HttpWebRequest.Create("http://localhost:20735/home/CorsApi"); var reader = new StreamReader(http.GetResponse().GetResponseStream(), Encoding.UTF8).ReadToEnd(); ViewBag.result = reader; return View(); }
项目Demo
本篇原创转载请注明出处
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 自己动手写Redis客户端(C#实现)2 - SET请求和状态回复(se 2018-06-27
- CORS跨域请求C#版 2018-06-27
- SuperSocket入门(一)-Telnet服务器和客户端请求处理 2018-06-27
- [httpserver]如何解析HTTP请求报文 2018-06-18
- HTTP协议的8种请求类型介绍 2018-06-18
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash