使用多年的一个开源的消息中间件,在以往的项目中,C/S编程没有任何问题,十分便捷顺手。
本次需要通过网站来订阅消息,发现网页一直报No ‘Access-Control-Allow-Origin‘ header的错误,这个问题我知道很久了,一直没有解决,今天终于解决了,做一个记录。
我先后尝试了以下方法:
1、给消息中间件的App.config中增加以下配置节,失败:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/>
<add name="Access-Control-Allow-Headers" value="x-requested-with,content-type"/>
<add name="Access-Control-Allow-Origin" value="*"/>
</customHeaders>
</httpProtocol>
</system.webServer>
2、给客户端网站的IIS增加http响应头部设置,Access-Control-Allow-Origin,*,失败;
3、配置网站的访问地址和消息中间件的访问地址在同一个域名和端口,成功,但这个其实不能跨域,还在域里面。只要客户端网站域名、端口和消息中间件的域名端口有一个不一样还是报跨域错误。
4、新建一个网站,域名和端口配置为和消息中间件一致,并给该网站的http响应头部设置,Access-Control-Allow-Origin,*,失败。
5、通过给网站增加clientaccesspolicy.xml文件来解决跨越,依然失败!
6、于是从网上搜索WCF 跨域,找到一篇文档:https://blog.csdn.net/dangercheng/article/details/17380529,该文件详细描述了从WCF服务端去处理问题,其本质还是给网站增加clientaccesspolicy.xml文件来解决跨越,依然失败!
最后,在网上找到一篇文章:https://www.jb51.net/article/190628.htm
最终,还是认为需要改消息中间件服务端代码才行!可是开源代码看着头痛啊,一是代码太多,二是代码晦涩难懂。
认真查看消息中间件源代码,找到以下位置,即在开频道、订阅消息、发送消息的返回之前对Context的头部添加跨域标记(注意不要重复添加,否则又报Multip Access-Control-Allow-Origin的错误),代码如下:
发布测试,终于成功,困扰多年的问题得到了解决,可以跨系统使用了!
服务端:
发送端的控制台程序:
网页端: