【问题标题】:How to pass some data through signalR header or query string in .net core 2.0 app如何在 .net core 2.0 应用程序中通过 signalR 标头或查询字符串传递一些数据
【发布时间】:2018-02-27 03:08:55
【问题描述】:

在 .net 4.7 中使用 signalR,我们能够将两个变量从客户端应用程序传递到 signalR 服务器。这是代码sn-p:

public class MyHub : Hub
{
    protected (string myVar1, string myVar2) GetValues() =>
            (
            Context.QueryString["MyVariable1"] ?? string.Empty,
            Context.QueryString["MyVariable2"] ?? string.Empty,
            );
}

javascript 客户端会按如下方式设置这些变量:

$.connection.hub.qs = {'MyVariable1' : 'val1', 'MyVariable2' : 'val2'};

现在,我们正在尝试迁移到用于 .net core 2.0 应用程序的 signalR 的 alpha 版本。阻碍是我们不能再使用这种方法来获取 myVar1 和 myVar2 的值。不仅 QueryString 不可用,而且标头也不可用。克服这种情况以将变量从客户端应用程序(Typescript)甚至.net核心应用程序传递到signalR服务器端的最佳方法是什么? 另外 - 你如何在客户端设置变量?

【问题讨论】:

    标签: c# asp.net signalr signalr-hub asp.net-core-signalr


    【解决方案1】:

    您可以像这样在您的中心访问HttpContext

    var httpContext = Context.Connection.GetHttpContext();
    

    然后使用httpContext.Request.Query["MyVariable"]获取变量值

    为 ASPNetCore 2.1 及更高版本编辑

    GetHttpContext() 扩展方法可在Context 对象上直接访问

    using Microsoft.AspNetCore.Http.Connections;
    ....
    var httpContext = Context.GetHttpContext();
    

    【讨论】:

    • 请注意:这是一种扩展方法,因此在包含 Microsoft.AspNetCore.SignalR 命名空间之前,您不会看到它列出来。
    • 嗨,你能举一些例子来插入与c#相关的参数吗?我正在使用 HubConnectionBuilder 来创建和启动我的连接。
    • 只需将参数附加到您传递的查询字符串即可启动连接?
    • 我仍然看不到参考Microsoft.AspNetCore.SignalR的扩展方法?在 .net 核心 2.1 中?
    • 您可能缺少 using 语句。你可以找到这个扩展方法here
    【解决方案2】:

    迟到加入这个话题。我可以让这种机制在 .net core 2.2 中工作的唯一方法是:

    #1 添加两个 Nuget 包

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Http.Connections" Version="1.1.0" />
        <PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="2.2.0" />
    </ItemGroup>
    

    #2 然后在我们的方法中 pe OnConnectedAsync():

        public override Task OnConnectedAsync()
        {
            var httpContext = Context.GetHttpContext();
            if (httpContext == null)
                throw new Exception("...");
    
            var query = httpContext.Request.Query;
            var userId = query.GetQueryParameterValue<long>("Foo");
            var clientId = query.GetQueryParameterValue<string>("Bar");
            var connectionId = Context.ConnectionId;
    
            [...]
    
            return base.OnConnectedAsync();
        }
    

    #3 还介绍了一些方便的 SignalR 扩展:

        static public class SignalrExtensions
        {
           static public HttpContext GetHttpContext(this HubCallerContext context) =>
              context
                ?.Features
                .Select(x => x.Value as IHttpContextFeature)
                .FirstOrDefault(x => x != null)
                ?.HttpContext;
    
           static public T GetQueryParameterValue<T>(this IQueryCollection httpQuery, string queryParameterName) =>
              httpQuery.TryGetValue(queryParameterName, out var value) && value.Any()
                ? (T) Convert.ChangeType(value.FirstOrDefault(), typeof(T))
                : default;
        }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      相关资源
      最近更新 更多