ABP WEBAPI 跨域问题
一、常见跨域及说明
同IP不同端口: http:IP:8001/api/user http:IP:8002/api/user
不同IP不同端口: http://172.28.20.100:8001/api/user http://172.128.20.100:8002/api/user
webapi 、 网站 都是http下
1、webapi发布在本地,调试debug网站后台调用webapi接口 跨域是允许访问
2、webapi发布在本地,调试debug网站前台ajax 调用webapi接口 跨域是不允许访问 需要做下面的跨域处理
二、不做跨域处理进行请求
那WebApi(http://172.23.13.232:80)和网站(http://localhost:57447)
$.ajax({
type: "GET",
url: "http://172.23.13.232/api/services/Employee/ArchiveManager/Archive/GetWebApi",
data: {id:5}
//dataType: "json",
//contentType: 'application/json; charset=utf-8'
}).success(function (res) {
alert(JSON.stringify(res.result));
}).error(function (xhr, status) {
console.log(xhr);
});
前台请求出现下错误:
三、CORS解决跨域问题的原理
CORS全称Cross-Origin Resource Sharing,中文全称跨域资源共享,是一种允许当前域的资源被其他域的脚本请求访问的机制。它解决跨域问题的原理是通过向http的请求报文和响应报文里面加入相应的标识告诉浏览器它能访问哪些域名的请求。比如我们向响应报文里面增加这个Access-Control-Allow-Origin:http://localhost:57447,就表示支持http://localhost:57447里面的所有请求访问系统资源。
四、CORS解决跨域问题的步骤
在NuGet包处安装Microsoft.AspNet.WebApi.Cors包
2、在WEBAPI 项目添加设置
在WebApiModule类添加 以下两行代码
//解决跨域问题
var cors = new EnableCorsAttribute("*", "*", "*");//第一个参数是指定的域(www.baidu.com 多个域可以以","分隔)
GlobalConfiguration.Configuration.EnableCors(cors);
引用using System.Web.Http.Cors;
以上两步设置完成 就可以跨域访问了
注意: 网上说加上上面的两行代码就可以,但我本地网站调试下 前台调用webapi 接口还是不管用 需要webapi中 设置指定域名才管用 参照第三步
3、设置跨域参数
第二步中使用的是config.EnableCors(new EnableCorsAttribute("*", "*", "*"));这样是很不安全的,现在设置为只允许某域名能访问
若允许多个域名访问WebApi,可用逗号隔开,示例代码如下:
public static void Register(HttpConfiguration config)
{
//跨域配置
config.EnableCors(new EnableCorsAttribute("http://localhost:57777,http://localhost:57447", "*", "*"));
......
}
前台访问代码
$.ajax({
type: "GET",
url: "http://172.23.13.232/api/services/Employee/ArchiveManager/Archive/GetWebApi",
data: {id:5}
//dataType: "json",
//contentType: 'application/json; charset=utf-8'
}).success(function (res) {
alert(JSON.stringify(res.result));
}).error(function (xhr, status) {
console.log(xhr);
});
后台访问代码
public ActionResult TestPostAction()
{
var re = HttpPostCreateRequest("http://172.23.13.232/api/services/Employee/ArchiveManager/Archive/GetAllArchiveByAppointVersion","versionId = 4");
return Content(re);
}
public static string HttpPostCreateRequest(string url,string param)
{
System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接
string result = "";//返回结果
HttpWebRequest request = null;
HttpWebResponse response = null;
try
{
byte[] bs = Encoding.ASCII.GetBytes(param);
//设置最大连接数
ServicePointManager.DefaultConnectionLimit = 200;
//设置https验证方式
//if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
//{
// ServicePointManager.ServerCertificateValidationCallback =
// new RemoteCertificateValidationCallback(CheckValidationResult);
//}
request = (HttpWebRequest)WebRequest.Create(url);
request.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0";
request.KeepAlive = true;
request.ProtocolVersion = HttpVersion.Version11;
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.Credentials = CredentialCache.DefaultCredentials;
request.AllowAutoRedirect = true;
request.Method = "POST";
request.Timeout = 60 * 1000;
//设置POST的数据类型和长度
request.ContentType = "application/x-www-form-urlencoded";
//安全证书4__.95155.com.crt ,Key:changit
//X509Certificate2 cert = new X509Certificate2(AppDomain.CurrentDomain.BaseDirectory + "bin\\4__.95155.com.crt", "changit");
//request.ClientCertificates.Add(cert);
request.ContentLength = bs.Length;
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(bs, 0, bs.Length);
}
//获取服务端返回
response = (HttpWebResponse)request.GetResponse();
//获取服务端返回数据
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
result = sr.ReadToEnd().Trim();
sr.Close();
}
catch (System.Threading.ThreadAbortException e)
{
System.Threading.Thread.ResetAbort();
throw e;
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError)
{
throw e;
}
}
catch (Exception e)
{
throw e;
}
finally
{
//关闭连接和流
if (response != null)
{
response.Close();
}
if (request != null)
{
request.Abort();
}
}
return result;
}