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解决跨域问题的步骤 

1、WebApi项目设置

在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", "*", "*"));
 
    ......
}
 

4、可以直接参考 Asp.net Web API 2 跨域请求的相关文档。

http://www.asp.net/web-api

 

前台访问代码

 $.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);
            });

 

var entitydto = { "Id": 6};
            
            $.ajax({
                type: "Post",
                url: "https://114.115.236.141/api/services/app/archive/Get",
                contentType: "application/json; charset=utf-8",//contentType: 'application/json',
                data: JSON.stringify(entitydto)
                //data: { "Id": 6  }
               
            }).success(function (res) {
                if (res.success) {
                    alert(res.success + JSON.stringify(res.result));
                } else {
                    alert(res.success + "失败!!!");
                }
               
            }).error(function (xhr, status) {
                console.log(xhr);
                alert("error失败!!!");
            });

后台访问代码

   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;
        }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值