asp.net core3.1 下跨域的正确方式
作为一个上进的程序猿必须要紧跟技术。等core出来稳定后(企业招聘基本全要会core,不会混不了饭吃泪)决定要掌握core。于是在腾讯课堂花了1.1软妹币白嫖了2门课程后又在B站学习一门掌握了入门知识即可进入自学时代了。
好现在开始把学生时做的后来用其它技术改版2遍仿QQ即时聊天工具迁移到core3.1+signalr+grpc,也就是单个web有多个页面+多个web(独立网站独立部署)+桌面程序+手机APP互通聊天
不过做到第一个signalr跨域的时候就遇到了不小阻力。所以这篇就是把signalr跨域单独拿出来做一篇,(不是上面的IM开发遇到的问题的案例是遇到问题单独抽出来做个DEMO,反正也刚开始改版问题目前只遇到signalr跨域)IM的话等积累到一个阶段再发
正戏开始伟大的分割线
我的项目结构:上面是提供资源访问的signalr服务端端口5001,下面端口5000因为方便就把做grpc+signalr的DEMO拿过来了。
遇到的问题:
因为当时问题很多反复调了近3天都不得,但是当时心如死灰没心情截图bug下来。所以只好凭着程序猿自带的渣记忆还原几个问题
问题1:
localhost/:1 Access to XMLHttpRequest at 'https://localhost:5001/ChatMsgCorsHub/negotiate' from origin 'https://localhost:5000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
网上百度:找到https://blog.csdn.net/a914541185/article/details/83181919
很可惜不行
问题2:
Access to XMLHttpRequest at 'https://localhost:5001/ChatMsgCorsHub/negotiate' from origin 'https://localhost:5000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
解决:
写个中间件增加回复头
public class CorsServerMiddleware{private readonly RequestDelegate _next;public CorsServerMiddleware(RequestDelegate next){_next = next;}public async Task Invoke(HttpContext context){if (!context.Response.Headers.ContainsKey("Access-Control-Allow-Origin")){context.Response.Headers.Add("Access-Control-Allow-Origin", "*");context.Response.Headers.Add("Access-Control-Allow-Methods", "*");context.Response.Headers.Add("Access-Control-Max-Age", "3600");context.Response.Headers.Add("Access-Control-Allow-Headers", "x-requested-with,Authorization");context.Response.Headers.Add("Access-Control-Allow-Credentials", "false");}await _next(context);}}
OK.出现问题3:
Access to XMLHttpRequest at 'https://localhost:5001/ChatMsgCorsHub/negotiate' from origin 'https://localhost:5000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
这个问题很鬼畜。。。我就是调了近一天都无果。。。还出现别的很多问题,但是没记下来BUG。所以直接到最后一步方案:
public void ConfigureServices(IServiceCollection services){services.AddCors(options =>{//登录用户使用options.AddPolicy("any", builder =>{builder.WithOrigins("http://crm.muzixiaohua.com/","http://localhost:64151","http://localhost:8080","null").AllowAnyMethod().AllowAnyHeader().AllowCredentials();});//公开使用options.AddPolicy("all", builder =>{builder.WithOrigins("*").AllowAnyMethod().AllowAnyHeader();});});services.AddControllersWithViews();services.AddSignalR();}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseMiddleware<CorsServerMiddleware>();app.UseHttpsRedirection();app.UseStaticFiles();app.UseCookiePolicy();app.UseCors("CorsPolicy"); //之前这句写到 下面去了导致一直报跨域访问的错误,顺序必须在 app.UseSignalR ... 这句设置之前才行, app.UseRouting();//注册signalr--指定跨域方案app.UseCors("any").UseEndpoints(endpoints =>{endpoints.MapHub<ChatMsgCorsHub>(pattern: "/ChatMsgCorsHub");});}
问题4:
Access to XMLHttpRequest at 'https://localhost:5001/ChatMsgCorsHub/negotiate' from origin 'https://localhost:5000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
解决方案:
options.AddPolicy("any", builder =>{builder.WithOrigins("http://crm.muzixiaohua.com/","http://localhost:64151","http://localhost:8080","https://localhost:5001",//增加"https://localhost:5000",//增加"null").AllowAnyMethod().AllowAnyHeader().AllowCredentials();});
还是不行:。。。出现上面的问题1。。。哈?百度N久改了一(亿)遍,仍然不行
这时候心累。。。万念俱灰觉得这个不是自己能力能解决的。。
收工玩大蛇无双3,正好我xbox手柄不能连发,自己找API开发一个连发软件。。。就这么过了一天。。
今天一脸死灰的打开这个DEMO...回忆一下上次的问题。。运行上面再运行下面。。
这个是 火山爆发.gif
可以了。没问题了。能正常运行了。什么鬼?
点击跨域按钮
全部没问题,代码就和上面写的最后一个一样。啥没改。
我知道。。了。。这就是
佛系开发吧。开发遇到问题没关系。能解决就解决不能解决等第二天。。自然就解决了。。。
附带说一句:
把上面的:中间件增加回复头 去掉依然没问题。。能正常运行
今天人品爆发。。见好就收。。
asp.net core3.1 下跨域的正确方式相关推荐
- html action能跨域么,ASP.NET MVC 中设置跨域
原标题:ASP.NET MVC 中设置跨域 来源:GetPower cnblogs.com/gdpw/p/9236661.html 程序员共读整理发布,转载请联系作者获得授权ASP.NET MVC中设 ...
- 允许asp.net web程序的跨域访问
什么叫跨域? 简单理解就是不同服务器,不同域名之间的访问. 如何设置asp.net web程序的跨域? 在web.config中添加如下代码 <system.webServer> < ...
- Spring Boot——Spring Security环境下跨域addCorsMappings与拦截器冲突导致跨域失效解决方案
问题分析 [SpringMVC]与权限拦截器冲突导致的Cors跨域设置失效问题 解决方案 @Beanpublic CorsFilter corsFilter() {//1.添加CORS配置信息Cors ...
- 工程与ArcGIS api for javascript不在同一个tomcat情况下跨域问题
当开发工程与ArcGIS API 所在tomcat不在一起是,即出现跨域问题,跨域问题集中在api的样式图片.字体pbf等. 解决方案: 在ArcGIS API所在tomcat添加跨域过滤器设置. 修 ...
- ie兼容模式下跨域访问问题的解决
先来说一下,什么是跨域访问, 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 所谓同源是指,域名,协议,端口均相同,不明白没关系 ...
- ASP.NET解决PDF.js跨域访问问题
PDF.js在访问pdf文件的时候,有时候会涉及到跨域问题,介绍一种.NET和PDF.js配合使用的方法. 前端代码: <script type="text/javascript&qu ...
- vue 解决跨域 调试_vue+Java后端进行调试时解决跨域问题的方式
今天在开发过程中遇到一个问题,拿到了一套vue代码,计划对这套代码的部分样式进行调整,Java后端代码已经写好并且部署到了线上.这时命令行运行vue项目时访问会受限,取不下数据来,遇到了跨域访问失败的 ...
- PHP后端API接口解决Ajax跨域请求的方式
如果我们是前后端分离,且不再同一域的情况下,前端使用Ajax请求后端的数据的时候,就会出现跨域的问题. 在前端我们可以使用获取jsonp格式来应对跨域问题,但是这种方式比较难用,如果前端后端都是可以进 ...
- java后端实现CROS跨域请求的方式
跨域: 跨域就是请求的url中的"协议"."域名"."端口号"其中任何一种不一样都是属于跨域.解决跨域的主要的四种方法是jsonp.跨域资源 ...
最新文章
- OpenCV(十八)霍夫变换(直线、线段与圆检测)
- 虚拟内存越大越好吗_滤波电容越大越好吗?
- C#中dynamic、ExpandoObject 的正确用法
- 【转】Windows8不联网直接安装.Net 3.5 Framework的方法
- map、mapPartitions、mapPartitionsWithIndex区别在哪里?
- git:如何让不同开发者提交在同一条直线上
- Centos上安装jdk版本出错的问题
- Java笔记(韩顺平Java基础1-2章)
- window电脑H265(HEVC)编码的mp4不显示缩略图解决办法
- 一行代码查看电脑Wifi密码
- c语言统计大写英文字母的个数,c语言 对任意输入的字符串,统计其中的大写字母和小写字母的个数...
- 【C语言】BC90小乐乐算多少人被请家长(DAY 5)
- PreScan 教程:0. PreScan与Matlab连接
- Python-被7整除
- PHP 二维数组 指定 value 作为 key || 二位数组 取出指定 元素组成新数组
- 计算机相关专业的兼职大总结
- 中美知识产权博弈:保护力度标准成最大分歧
- 少儿编程Scratch学习教程2--官方初学指南
- 模拟集成电路设计学习笔记(一)IC617工艺库安装
- 惊悚恐怖好片推荐(喜欢看片的朋友们看过来)