在SignalR的Startup中启用UseHttpContext以便访问HttpContext。
在Startup.cs的ConfigureServices方法中添加以下代码:
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.AddHubOptions
并且在Configure方法中添加以下代码:
app.UseRouting(); app.UseAuthentication(); app.UseAuthorization();
app.UseEndpoints(endpoints => {
endpoints.MapControllers();
endpoints.MapHub
在MyHub.cs中可以访问HttpContext,可以通过以下代码进行访问:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.SignalR;
namespace My.Namespace { [Authorize] public class MyHub : Hub { private readonly IHttpContextAccessor _httpContextAccessor;
public MyHub(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public async Task SendMessage(string message)
{
var httpContext = _httpContextAccessor.HttpContext;
var username = httpContext.User.Identity.Name;
await Clients.All.SendAsync("ReceiveMessage", username, message);
}
}
}
在上面的示例中,MyHub使用IHttpContextAccessor作为依赖注入进行构造,并在SendMessage方法中访问了HttpContext以获取用户信息。