为了设置正确的上下文,让我解释一下这个问题.直到RC1,我们用来实现GenerateConnectionIdPrefix()以将用户Id添加到连接ID.然后我们可以随时从连接字符串中检索用户ID.
使用RC2,我们现在无法继承IConnectionIdPrefixGenerator并实现GenerateConnectionIdPrefix.所以我想知道可以通过我们的数据在集线器上设置任何属性的其他途径是什么,这些资源在连接的整个生命周期中都会持续存在.
通过文档,我意识到设置查询字符串是一种方式,但这意味着我们需要为每个调用设置它.设置往返状态可能是另一种选择,但看起来甚至是单个往返而不是整个生命周期.
所以我的最终目标是在SignalR连接开始时设置为属性,可以在整个连接生命周期中使用.
如果现在没有什么可用,是否有任何计划在下一版本中添加支持以实现类似的功能?
[更新]如下所示,我尝试在OnConnected方法中设置状态Clients.Caller.Userid,然后在后续调用中尝试访问它,我发现它为null.两个呼叫都来自相同的连接ID.
我想在特定时间间隔后使用集线器将一些数据从服务器发送到所有连接的客户端。如何使用信号器集线器完成此操作。
我对 OWIN 或 ASP .NET 不是很熟悉,但我正在基于配置了个人用户帐户的 MVC 模板构建一个站点,并且我遇到了 OWIN cookie 中间件的问题。我正在使用ApplicationSignInManager项目模板中提供的默认值,并且我还使用 SignalR 集线器进行一些实时工作。现在,在某些情况下,我想使用 SignalR 集线器登录用户。这段代码:
Get<ApplicationSignInManager>().PasswordSignInAsync(…)
Run Code Online (Sandbox Code Playgroud)
在控制器操作中效果很好,因为该操作将导致带有Set-Cookie标头的 HTTP 响应,该标头将按.AspNet.ApplicationCookie预期设置,并且进一步的请求将包含它。由于我是从 SignalR 集线器而不是控制器返回一个值,我虽然只是获取 cookie 并将其设置在集线器的客户端方法中,以模拟控制器响应。
但是我似乎无法弄清楚如何找到 cookie 值。
我已经基本上浏览IOwinContext了 cookie中的所有内容,但无处可寻。我可以找到登录的ClaimsIdentity很好,而不是 cookie,想。我已经阅读了一些资料,我认为这是因为在我查找 cookie 时,实际设置 cookie 的中间件尚未执行。它可能根本不会执行,因为在集线器中,我什至不知道我是否在 OWIN 管道中。我只是这样做:
HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>().PasswordSignInAsync()
Run Code Online (Sandbox Code Playgroud)
我试图像这样添加我自己的中间件:
app.Use(async (context, next) => { await next; });
Run Code Online (Sandbox Code Playgroud)
但是这个中间件根本没有被击中,这让我觉得通过获取ApplicationSignInManager我正在创建的 SignalR IPrincipal,是的,但没有其他任何事情发生,即执行 cookie 中间件,它将设置Set-Cookie我所追求的 HTTP 响应标头。
有没有办法解决这个问题,让我的用户登录 SignalR,然后重新启动客户端上的连接,以便下一次OnConnected调用接收我手动设置的 cookie 并IPrincipal从中找出正确的方法?我可以让 OWIN 管道在集线器中运行吗?
我正在尝试使用signalr将数据存储在asp.net应用程序中.在这里说明我的问题是一个例子.
我有一个集线器,通知控件用户已连接并发送他的ID.
public static event EventHandler<IdEventArgs> userConnected;
public void Connected()
{
Debug.WriteLine("Hub Connected Method");
var id = Context.ConnectionId;
userConnected(this, new IdEventArgs(id));
}
Run Code Online (Sandbox Code Playgroud)
然后我有我的控制器将事件处理程序添加到集线器
public ActionResult Index()
{
LoadingHub.userConnected += new EventHandler<IdEventArgs>(UserConnected);
return View();
}
Run Code Online (Sandbox Code Playgroud)
最后我的方法应该保存获取的数据
private void UserConnected(object sender, IdEventArgs e)
{
Debug.WriteLine("User Connected with Id: " + e.Id);
//To do:
//save data
}
Run Code Online (Sandbox Code Playgroud)
我尝试保存到Session,但Session对象在这里为null.我遇到了用户配置文件,这可能是一个很好的解决方案 - 当用户连接到内部存储数据时,是否可以创建新的配置文件,当他断开连接以销毁所述配置文件时?或者也许完全不同的方法在这里更容易理解?
我正在尝试使用SignalR 2.2将成员添加到组中.每次,我都会达到30秒的超时并获得"System.Threading.Tasks.TaskCanceledException:任务被取消了." 错误.
从我写的GroupSubscriptionController,我打电话给:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<ProjectHub>();
await hubContext.Groups.Add(connectionId, groupName);
Run Code Online (Sandbox Code Playgroud)
我发现这个问题是人们经常遇到这个问题,但每次都发生在我身上.我正在一个VS2015上启动localhost端口运行后端(ASP.NET 4.5),而另一个VS 2015上的前端(AngularJS SPA)启动了localhost端口.
我已经让SignalR工作到了向每个连接的客户端广播消息的程度.这看起来很容易.现在,添加Groups部分(以便人们只从服务器获取选择的消息)让我把头发拉出来......
我在页面中动态引用了两个库.当我浏览我的应用程序时,下面提到的错误没有进入Chrome浏览器.但在Internet Explorer中会发生错误.
var signalRLibrary = document.createElement('script');
signalRLibrary.type = "text/javascript";
signalRLibrary.src = 'jquery.signalR-2.1.2.min.js';
document.getElementsByTagName('head')[0].appendChild(signalRLibrary);
var signlaRHub = document.createElement('script');
signlaRHub.type = "text/javascript";
signlaRHub.src = "~/signalr/hubs";
document.getElementsByTagName('head')[0].appendChild(signlaRHub);
Run Code Online (Sandbox Code Playgroud)
在页面加载期间,由于未加载SignalR,我得到了以下错误.请确保在〜/ signalr/js之前引用了jquery.signalR-x.js.
if (typeof ($.signalR) !== "function") {
throw new Error("SignalR: SignalR is not loaded. Please ensure jquery.signalR-x.js is referenced before ~/signalr/js.");
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试从我的依赖注入器获取实现类型的所有通用服务
protected List<ServiceDescriptor> GetGenericServicesFromGenericTypeDefinition(IServiceCollection services, Type baseGenericTypeDefinition)
{
if(false == baseGenericTypeDefinition.IsGenericTypeDefinition)
{
throw new Exception($"Invalid Argument {nameof(baseGenericTypeDefinition)}");
}
//TODO: check the base type recursively
var genericImplementations = services.Where(s => s?.ImplementationType.GetTypeInfo().IsGenericType ?? false)
.ToList();
//.... Omitted unrelated to issue
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当它试图创建genericImplementations List时,我收到一个错误
System.ArgumentNullException:'值不能为空.'
我检查了它不是null的服务,但是实现类型.这怎么可能,这有些与func如何构建有关?

编辑 我如何使用Elvis操作员错误?你可以看到s有一个值.从图片.错误是从检查的类型生成的,这怎么可能?
I have successfully integrated SignalR.AspNetCore into my AbpZero template. everything works fine. However when I tried to add a hub into my application like what has been described in the document, I am getting the following error on
public async Task SendMessage(string message)
{
await Clients.All.InvokeAsync("getMessage", string.Format("User {0}: {1}", AbpSession.UserId, message));
}
Run Code Online (Sandbox Code Playgroud)
Error CS1061 'IClientProxy' does not contain a definition for 'InvokeAsync' and no extension method 'InvokeAsync' accepting a first argument of type 'IClientProxy' could be found (are you …
尝试按照以下链接中的建议将JWT令牌传递到我的 SignalR 集线器,但到目前为止它不起作用。具体参见 David Fowler 在 2017 年 7 月 22 日的建议。https://github.com/aspnet/SignalR/issues/130
我的前端是React这样,我只是将令牌添加到查询字符串中,如下所示,其中_token有我的JWT令牌值:
const connection = new signalR.HubConnectionBuilder()
.withUrl("/myhub?AUTHORIZATION=" + _token)
.configureLogging(signalR.LogLevel.Information)
.build();
Run Code Online (Sandbox Code Playgroud)
在ConfigureServices()my的方法中Startup.cs,我对Jwt令牌进行了以下配置:
services.AddAuthentication(options => {
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(jwtOptions => {
jwtOptions.Authority = $"https://login.microsoftonline.com/tfp/{Configuration["AzureAdB2C:Tenant"]}/{Configuration["AzureAdB2C:Policy"]}/v2.0/";
jwtOptions.Audience = Configuration["AzureAdB2C:ClientId"];
jwtOptions.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
if(context.HttpContext.WebSockets.IsWebSocketRequest)
context.Token = context.Request.Query["AUTHORIZATION"];
return Task.CompletedTask;
}
};
});
Run Code Online (Sandbox Code Playgroud)
这就是我的Hub样子:
[Authorize]
public class …Run Code Online (Sandbox Code Playgroud) 本文介绍使用IUserIdProvider接口。它显示了如何使用GlobalHost来使SignalR使用您的用户ID提供程序。但是SignalR for .Net Core没有GlobalHost。什么是替代品?