作为一个上进的程序猿必须要紧跟技术。等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 下跨域的正确方式相关推荐

  1. html action能跨域么,ASP.NET MVC 中设置跨域

    原标题:ASP.NET MVC 中设置跨域 来源:GetPower cnblogs.com/gdpw/p/9236661.html 程序员共读整理发布,转载请联系作者获得授权ASP.NET MVC中设 ...

  2. 允许asp.net web程序的跨域访问

    什么叫跨域? 简单理解就是不同服务器,不同域名之间的访问. 如何设置asp.net web程序的跨域? 在web.config中添加如下代码 <system.webServer> < ...

  3. Spring Boot——Spring Security环境下跨域addCorsMappings与拦截器冲突导致跨域失效解决方案

    问题分析 [SpringMVC]与权限拦截器冲突导致的Cors跨域设置失效问题 解决方案 @Beanpublic CorsFilter corsFilter() {//1.添加CORS配置信息Cors ...

  4. 工程与ArcGIS api for javascript不在同一个tomcat情况下跨域问题

    当开发工程与ArcGIS API 所在tomcat不在一起是,即出现跨域问题,跨域问题集中在api的样式图片.字体pbf等. 解决方案: 在ArcGIS API所在tomcat添加跨域过滤器设置. 修 ...

  5. ie兼容模式下跨域访问问题的解决

    先来说一下,什么是跨域访问, 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 所谓同源是指,域名,协议,端口均相同,不明白没关系 ...

  6. ASP.NET解决PDF.js跨域访问问题

    PDF.js在访问pdf文件的时候,有时候会涉及到跨域问题,介绍一种.NET和PDF.js配合使用的方法. 前端代码: <script type="text/javascript&qu ...

  7. vue 解决跨域 调试_vue+Java后端进行调试时解决跨域问题的方式

    今天在开发过程中遇到一个问题,拿到了一套vue代码,计划对这套代码的部分样式进行调整,Java后端代码已经写好并且部署到了线上.这时命令行运行vue项目时访问会受限,取不下数据来,遇到了跨域访问失败的 ...

  8. PHP后端API接口解决Ajax跨域请求的方式

    如果我们是前后端分离,且不再同一域的情况下,前端使用Ajax请求后端的数据的时候,就会出现跨域的问题. 在前端我们可以使用获取jsonp格式来应对跨域问题,但是这种方式比较难用,如果前端后端都是可以进 ...

  9. java后端实现CROS跨域请求的方式

    跨域: 跨域就是请求的url中的"协议"."域名"."端口号"其中任何一种不一样都是属于跨域.解决跨域的主要的四种方法是jsonp.跨域资源 ...

最新文章

  1. OpenCV(十八)霍夫变换(直线、线段与圆检测)
  2. 虚拟内存越大越好吗_滤波电容越大越好吗?
  3. C#中dynamic、ExpandoObject 的正确用法
  4. 【转】Windows8不联网直接安装.Net 3.5 Framework的方法
  5. map、mapPartitions、mapPartitionsWithIndex区别在哪里?
  6. git:如何让不同开发者提交在同一条直线上
  7. Centos上安装jdk版本出错的问题
  8. Java笔记(韩顺平Java基础1-2章)
  9. window电脑H265(HEVC)编码的mp4不显示缩略图解决办法
  10. 一行代码查看电脑Wifi密码
  11. c语言统计大写英文字母的个数,c语言 对任意输入的字符串,统计其中的大写字母和小写字母的个数...
  12. 【C语言】BC90小乐乐算多少人被请家长(DAY 5)
  13. PreScan 教程:0. PreScan与Matlab连接
  14. Python-被7整除
  15. PHP 二维数组 指定 value 作为 key || 二位数组 取出指定 元素组成新数组
  16. 计算机相关专业的兼职大总结
  17. 中美知识产权博弈:保护力度标准成最大分歧
  18. 少儿编程Scratch学习教程2--官方初学指南
  19. 模拟集成电路设计学习笔记(一)IC617工艺库安装
  20. 惊悚恐怖好片推荐(喜欢看片的朋友们看过来)

热门文章

  1. m1 macbook虚拟机安装Ubuntu 20.04
  2. 【C/C++: 字符数组的赋值】
  3. android 用editview 禁用输入法,涉及到的几个事件
  4. java sleep函数让出cpu_线程主动让出CPU
  5. 字节跳动中台数据分析师社招面经(已offer)
  6. 「清华集训 2017」某位歌姬的故事
  7. 亚马逊在国内用什么收款方式好呢?
  8. 自动化运维工具Ansible,保姆级讲解
  9. GridBagConstraints常用参数解析
  10. echarts 折线图(波纹) 隐藏线点文字