比如说现在有两个网站,webA 和 webB ,
如果webA的其中一个html页面中,使用ajax请求webB的一个方法,例如:
//HTML In webA
$(function () {
$('#btnajax').click(function () {
$.ajax({
type: "POST",
url: "http://webB/home/getqita",
data: {},
success: function (data) {
alert(data);
},
error: function (jqXHR) {
}
});
});//end click
});//end page ready
这个时候,如果webB 的 /home/getqita 没有进行任何的跨域操作处理 , 那么webA 的js机会提示错误,大概如下:
Access to XMLHttpRequest at 'http://webB/home/getqita'
from origin 'http://lwebA' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
在前端js运行的时候会提示这个错误, 那么如何解决呢?
第一种思路,可以改造webB 里面的 /home/getqita 方法, 在对应的controller-Action里面,给Response增加Header内容,例如:
//Controller-action in webB
[HttpPost]
public ActionResult GetQita()
{
Response.AppendHeader("Access-Control-Allow-Origin", "*");
return Content("qi ta");
}
("Access-Control-Allow-Origin", "*") 中的星号,代表允许所有网站的跨域请求 。
重新运行webB之后, 就可以在webA中ajax正常请求到http://webB/home/getqita 了 。
第二种思路,有些时候,webB根本就不是自己家开发的,是其他团队提供的 , 无法要求他人改造webB ,
所以只好在自己的webA中解决 , 刚刚上面的报错是存在前端js提示的错误 , 我们可以利用C# 中 HttpWebRequest 后台操作,
在webA 中新加一个controller ,然后利用HttpWebRequest 获得 http://webB/home/getqita 的数据, 然后webA的任何一个前端ajax都可以取数据了,
// new controller in webA
[HttpPost]
public ActionResult GetWebB()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webB_URL);
....
return Content();
}
我是比较推荐第二种思路的, 网上有很多 HttpWebRequest 的文章 ,参考下就可以写出来了 。
大多都是构造好parpmeter ,然后对着url 进行post( RequestStream.Write() ) , 然后读取response stream 。
本人菜鸟一个,写错的话请见谅。