web-dev-qa-db-ja.com

.net Core2.0アプリでsignalRヘッダーまたはクエリ文字列を介してデータを渡す方法

.net 4.7でsignalRを使用して、クライアントアプリケーションからsignalRサーバーに2つの変数を渡すことができました。コードスニペットは次のとおりです。

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 Core2.0アプリケーション用のsignalRのアルファリリースへの移行を試みています。ブロッカーは、myVar1とmyVar2の値を取得するためにこのメソッドを使用できなくなったことです。 QueryStringだけでなく、ヘッダーも使用できません。この状況を克服して、クライアントアプリ(TypeScript)または.netコアアプリからsignalRサーバー側に変数を渡すことができるようにするための最良の方法は何ですか?また、クライアント側で変数をどのように設定しますか?

9
Arash

次のように、ハブのHttpContextにアクセスできます。

_var httpContext = Context.Connection.GetHttpContext();
_

次に、_httpContext.Request.Query["MyVariable"]_を使用して変数値を取得します

ASPNetCore 2.1以降用に編集

GetHttpContext()拡張メソッドはContextオブジェクトから直接アクセスできます

_using Microsoft.AspNetCore.Http.Connections;
....
var httpContext = Context.GetHttpContext();
_
19
Pawel

このスレッドへの参加が遅れています。このメカニズムを.netCore 2.2で機能させる唯一の方法は、次のとおりです。

12つの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;
    }

お役に立てれば。

3
XDS