【发布时间】:2018-07-03 10:24:01
【问题描述】:
我基于另一个(开源)项目在 C# 上编写了 XMPP 服务器。该项目有很多帮助我处理 XMPP 协议的处理程序,但没有 BOSH 连接管理器 - 所以我写了一个。
这个想法是在浏览器上使用标准客户端(通过 TCP 连接)和 Converse.JS。
标准客户端运行良好,但 Converse.JS 出现问题。我的问题不是自己处理 bosh 请求,而是处理 Converse.JS 发送的初始 OPTIONS 请求(带有空正文)。
根据他们的论坛(我在哪里发布了这个Issue)
OPTIONS请求是一个所谓的preflight request,用来判断被查询的域是否支持CORS。 IIRC 这仅在发出跨域请求时发生。如果您打算支持 CORS,则需要适当地响应 OPTIONS 请求。
研究了一下,我想出了这个解决方案(这是行不通的,因为 Converse.JS 不断发送 OPTIONS 请求,直到连接失败):
internal static void SendCORSResponse(HttpListenerContext ctx)
{
ctx.Response.StatusCode = (int)HttpStatusCode.OK; //200
ctx.Response.AddHeader("Access-Control-Allow-Origin", "*");
ctx.Response.AddHeader("Access-Control-Allow-Methods", "GET,POST,HEAD,PUT,DELETE,OPTIONS");
ctx.Response.AddHeader("Access-Control-Allow-Headers", "content-type");
ctx.Response.AddHeader("Access-Control-Max-Age", "86400");
ctx.Response.AddHeader("Accept-Encoding", "gzip");
ctx.Response.AddHeader("Accept-Charset", "utf-8");
ctx.Response.AddHeader("Accept-Language", "*");
ctx.Response.AddHeader("Accept", "*");
ctx.Response.Close(); //sends the response
}
当标头包含 OPTIONS 标记时,在处理连接的类上调用该函数。我做了什么,或者我做错了什么?
【问题讨论】:
标签: c# cors converse.js