如何通过.net core 2.0 app中的signalR头或查询字符串传递一些数据

时间:2017-09-18 14:20:50

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

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

/srv/users/*/log
/srv/users/*/run

javascript客户端会将这些变量设置如下:

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

现在,我们正在尝试迁移到.net核心2.0应用程序的signalR的alpha版本。阻止程序是我们不能再使用此方法来获取myVar1和myVar2值。不仅QueryString不可用,还有标题。为了能够将变量从客户端应用程序(Typescript)甚至.net核心应用程序传递到signalR服务器端,最好的方法是什么? 另外 - 如何在客户端设置变量?

2 个答案:

答案 0 :(得分:13)

您可以像这样访问集线器中的Comment

HttpContext

然后使用var httpContext = Context.Connection.GetHttpContext(); 获取变量值

编辑ASPNetCore 2.1及更高版本

可以在httpContext.Request.Query["MyVariable"]对象

上直接访问

GetHttpContext()扩展方法

Context

答案 1 :(得分:1)

最新加入此线程。我可以使该机制在.ne​​t 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 = Context.GetHttpContext().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;
    }

希望这会有所帮助。