附加 Cookie - SignalR 核心
Append Cookie - SignalR Core
在 Hub 中,当我尝试添加 cookie 时出现此错误:“无法修改响应 headers,因为响应有已经开始了.
以下是在 Hub 中添加 cookie 的示例代码:
if (!Context.GetHttpContext().Request.Cookies.ContainsKey("_a_cookie")) {
Context.GetHttpContext().Response.Cookies.Append("_a_cookie", "1");
}
有什么让它发挥作用的想法吗?
SignalR基于WebSockets,我们知道websocket不同于http,但是http支持cookie,websocket目前还不支持。
所以在信号集线器中设置 cookie 的唯一机会是在连接连接时,因为该连接请求基于 http。
最终,我最终实现了自己的中间件,在客户端尝试连接时像这样添加 cookie:
public class SignalRCookieIdMiddleware
{
private readonly RequestDelegate _next;
public SignalRCookieIdMiddleware(RequestDelegate next) {
_next = next;
}
public async Task InvokeAsync(Microsoft.AspNetCore.Http.HttpContext context) {
if(context.Request.Path == "/{HUB_NAME}/negotiate") {
if (!context.Request.Cookies.ContainsKey("_a_cookie")) {
context.Response.Cookies.Append("_a_cookie", 1);
}
}
// Call the next delegate/middleware in the pipeline
await _next(context);
}
}
然后在 Startup.cs 的 Configure 里面我添加了:
app.UseMiddleware<SignalRCookieIdMiddleware>();
在 Hub 中,当我尝试添加 cookie 时出现此错误:“无法修改响应 headers,因为响应有已经开始了.
以下是在 Hub 中添加 cookie 的示例代码:
if (!Context.GetHttpContext().Request.Cookies.ContainsKey("_a_cookie")) {
Context.GetHttpContext().Response.Cookies.Append("_a_cookie", "1");
}
有什么让它发挥作用的想法吗?
SignalR基于WebSockets,我们知道websocket不同于http,但是http支持cookie,websocket目前还不支持。
所以在信号集线器中设置 cookie 的唯一机会是在连接连接时,因为该连接请求基于 http。
最终,我最终实现了自己的中间件,在客户端尝试连接时像这样添加 cookie:
public class SignalRCookieIdMiddleware
{
private readonly RequestDelegate _next;
public SignalRCookieIdMiddleware(RequestDelegate next) {
_next = next;
}
public async Task InvokeAsync(Microsoft.AspNetCore.Http.HttpContext context) {
if(context.Request.Path == "/{HUB_NAME}/negotiate") {
if (!context.Request.Cookies.ContainsKey("_a_cookie")) {
context.Response.Cookies.Append("_a_cookie", 1);
}
}
// Call the next delegate/middleware in the pipeline
await _next(context);
}
}
然后在 Startup.cs 的 Configure 里面我添加了:
app.UseMiddleware<SignalRCookieIdMiddleware>();