AspNetCoreApi 跨域处理
如果咱们有处理过MV5 跨域问题这个问题也不大。
(1)为什么会出现跨域问题:
浏览器安全限制了前端脚本跨站点的访问资源,所以在调用WebApi 接口时不能成功访问资源,原因“同源策略”的存在:
同源指以下几点相同
(1) IP地址/域名
(2) 端口号
(3) 网络协议)
以上三点相同即为同源,浏览器将不做限制。
(同源) WebFrom 前台Ajax调用后台PageLoad页时 因为是在同一站点,以上三点均满足,也就不会出现跨域的问题。
(不同源) 比如用微服务开发时,前台和微服务没有在同一台服务器上,虽然端口相同IP不同协议也相同,这时就会出现了跨域的问题了。
引用脚本时会有例外:
(2)文章以AspNetCore Api 为例
2.1:首先创建一个CoreAPI的项目(这个就不多说了)
2.2:确保项目NuGet中引用 AspNetCore.ALL 里面包含 AspNetCore.Cors
如果没有右击项目依赖项代开NuGet管理工具
如图所示查找:
2.3:在Startup.cs 文件的ConfigureServices方法中注入如下代码:
(1)第一种
services.AddCors(options => options.AddPolicy("Domain", builder => builder.WithOrigins("http://a.example.com", "http://c.example.com").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials()));
"http://a.example.com", "http://c.example.com" 代表着允许访问的域,就好像给这个域开放了一个权限,允许访问的权限,可以写多个逗号分隔
(2)第二种
services.AddCors(options => options.AddPolicy("Domain", builder => builder.AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials()));
//AllowAnyMethod允许跨域策略允许所有的方法:GET/POST/PUT/DELETE 等方法 如果进行限制需要 AllowAnyMethod("GET","POST") 这样来进行访问方法的限制
//AllowAnyHeader允许任何的Header头部标题 有关头部标题如果不设置就不会进行限制 //AllowAnyOrigin 允许任何来源 //AllowCredentials 设置凭据来源
这里是重点不多说了:F12 查看源 阅读注释就明白了。
在项目中可以写 多个services.AddCors() 需要注意的是 Domain1 的区别 咱们可以针对不同的限制些不同的 限制规则
services.AddCors(options => options.AddPolicy("Domain1", builder => builder.WithOrigins("http://a.example.com", "http://c.example.com").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials()));services.AddCors(options => options.AddPolicy("Domain2", builder => builder.WithOrigins("http://a.example.com", "http://c.example.com").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials()));services.AddCors(options => options.AddPolicy("Domain3", builder => builder.WithOrigins("http://a.example.com", "http://c.example.com").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials()));services.AddCors(options => options.AddPolicy("Domain4", builder => builder.WithOrigins("http://a.example.com", "http://c.example.com").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials()));
为什么做这么多限制呢:其实大家每个请求都包含了很多内容:
比如:通过 抓包工具看到的每条请求所包含的请求信息
再比如:我们通过HTTP发送请求时进行的设置:下图举例还可以设置更多的设置,这些设置都可以通过
services.AddCors()来进行设置:
2.4:在Startup.cs 文件中的Configure()方法中注册我们的 Domain
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseCors("Domain1"); app.UseCors("Domain2"); app.UseCors("Domain3"); app.UseCors("Domain4"); }
上面操作完之后我们就结束了准备任务现在可以进行使用了:使用方法如下:
2.5:使用如下: (1)第一种 action[HttpGet("{OrderNO}/{BranchID}")] //启用跨域 [EnableCors("Domain")] public Object getMultipleOrderDetail(string OrderNO, int OrderNoType, string BranchID) { return vM.getMultipleOrderDetail(OrderNO, OrderNoType, BranchID); }
(2)第二种 控制器
//启用跨域 [EnableCors("Domain")] [Produces("application/json")] [Route("api/BorrowOrder/[action]")] public class SP_PartsBorrowOrderController : Controller {
2.6 :前台调用代码如下:
重点是:这个节点 xhrFields: { withCredentials:true //跨域请求中带cookie },//必须有这项的配置,不然cookie无法发送至服务端
本文是以 CORS 进行实现
转载请注明出处谢谢!
用17写AspNetCore 也一年了,最近出现了这个问题 :
在点击发布的时候 报错了,构建失败的问题,刚开始还排查日子,删除以往的发布遗留痕迹,后来发现不行,
但是项目在本地运行的时候是好使的,生成也不会报错。
我们项目中有3个解决方案,只有其中一个可以进行发布,我就对项目的(共同引用)进行查看。
这是错误信息:
解决方法:我以前用的是2.0.0版本的,可能在项目中新建的解决方案我引用的是2.0.3的,导致另外两个解决方案发布不了。总之我跟新了 引用包就OK了
Create PROCEDURE [dbo].[Proc_B2B_GetBatchMainPaging] @StationNo AS varchar(50) , --m @StationName AS varchar(50) , --m @PartNo AS varchar(50) , -- son @PartName AS varchar(200) , --son @IsOldPart AS varchar(1) , --m @IsRebate AS varchar(1) , --m @IsTransport AS varchar(1) , --m @startApplyTime AS varchar(200) , --m @endApplyTime AS varchar(200) , --m @startExpectDate AS varchar(200), --m @endExpectDate AS varchar(200) , --m @page AS int , -- @size AS int -- -- B2B_BatchPartMain as m -- B2B_BatchApprovalDetail as D -- B2B_BatchSendPartInfo as s -- B2B_BatchPartsInfo as sonASBEGINCREATE TABLE #ReturnTable ( [PartNo] varchar(20) NULL , -- son[PartName] varchar(200) NULL , -- son[Counts] DECIMAL(18,2) NULL , -- son[ApplyPrice] [decimal](18, 2) NULL, -- son[ApprovalPrice] [decimal](18, 2) NULL, -- son[IsOldPart] [varchar](1) NULL, --m[StationNo] [varchar](8) NOT NULL, --m[StationName][varchar](100) NOT NULL, --m[ExpectDate] [datetime] NULL, --m[OrderStatus] [varchar](4) NULL, --m[ApplyTime] [datetime] NULL, --m[CurrnetApprover] [varchar](20) NULL, --D[ApprovalTime] [datetime] NULL, --D[Supply] [varchar](200) NULL --s);CREATE TABLE #ReturnData ( [PageIndex] varchar(20) NULL , [PageSize] varchar(200) NULL , [totalNumber] varchar(20) NULL , [PageCount] varchar(50) NULL , ); DECLARE @strSql varchar(MAX); --拼接Sql语句set @strSql='select son.PartNo,son.PartName,son.Counts,son.ApplyPrice,son.ApprovalPrice,m.IsOldPart,m.StationNo,m.StationName,m.ExpectDate,m.OrderStatus,ApplyTime,D.CurrnetApprover,d.ApprovalTime,s.Supplyfrom B2B_BatchPartMain as m JOIN B2B_BatchPartsInfo as son ON m.BOrderNo=son.BOrderNo JOIN B2B_BatchApprovalDetail as D ON m.BOrderNo=D.BOrderNo JOIN B2B_BatchSendPartInfo AS S ON m.BOrderNo=S.BOrderNo where 1=1' set @strSql= @strSql + ' AND convert(varchar(100), m.ApplyTime,21)>= ''' + convert(varchar(100), @startApplyTime,21) + ''' ' set @strSql= @strSql + ' AND convert(varchar(100), m.ApplyTime,21)<= ''' + convert(varchar(100), @endApplyTime,21) + ''' ' set @strSql= @strSql + ' AND convert(varchar(100), m.ExpectDate,21)>= ''' +convert(varchar(100), @startExpectDate,21) + ''' ' set @strSql= @strSql + ' AND convert(varchar(100), m.ExpectDate,21)<= ''' +convert(varchar(100), @endExpectDate,21) + ''' ' if( @StationNo is not null) begin set @strSql= @strSql + ' and m.StationNo =''' + @StationNo+'''' ; end --判断拼接Sql语句 if( @StationName is not null) and (@StationName!='') begin set @strSql= @strSql + ' and m.StationName =''' + @StationName+'''' ; end if( @PartNo is not null)and (@PartNo!='') begin set @strSql= @strSql + ' and son.PartNo =''' + @PartNo+'''' ; end if( @PartName is not null)and (@PartName!='') begin set @strSql= @strSql + ' and son.PartName =''' + @PartName+'''' ; end if( @IsOldPart is not null)and (@IsOldPart!='') begin set @strSql= @strSql + ' and m.IsOldPart =''' + @IsOldPart+'''' ; end if( @IsRebate is not null)and (@IsRebate!='') begin set @strSql= @strSql + ' and m.IsRebate =''' + @IsRebate+'''' ; end if( @IsTransport is not null)and (@IsTransport!='') begin set @strSql= @strSql + ' and m.IsTransport =''' + @IsTransport+'''' ; end --插入数据到临时表 insert INTO #ReturnTable exec(@strSql) ; --总数量 DECLARE @totalNumber as INT ; select @totalNumber=COUNT(PartNo) from #ReturnTable; -- 总页数 DECLARE @PageCount as INT ; SET @PageCount= Ceiling(@totalNumber*1.0/@size); --插入返回信息 INSERT into #ReturnData VALUES(@page,@size,@totalNumber,@PageCount) --分页查询数据 select * from (select ROW_NUMBER() over(order by PartNo asc) as rowNumber , * from #ReturnTable) as temp where rowNumber between (((@page-1)*@size)+1) and (@page*@size) select * from #ReturnData; --删除临时表 drop table #ReturnTable