.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サーバー側に変数を渡すことができるようにするための最良の方法は何ですか?また、クライアント側で変数をどのように設定しますか?
次のように、ハブのHttpContext
にアクセスできます。
_var httpContext = Context.Connection.GetHttpContext();
_
次に、_httpContext.Request.Query["MyVariable"]
_を使用して変数値を取得します
ASPNetCore 2.1以降用に編集
GetHttpContext()
拡張メソッドはContext
オブジェクトから直接アクセスできます
_using Microsoft.AspNetCore.Http.Connections;
....
var httpContext = Context.GetHttpContext();
_
このスレッドへの参加が遅れています。このメカニズムを.netCore 2.2で機能させる唯一の方法は、次のとおりです。
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Http.Connections" Version="1.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="2.2.0" />
</ItemGroup>
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();
}
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;
}
お役に立てれば。