代码之家  ›  专栏  ›  技术社区  ›  Arash

如何通过中的信号器标头或查询字符串传递一些数据。net core 2.0应用程序

  •  13
  • Arash  · 技术社区  · 7 年前

    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'};
    

    现在,我们正在尝试迁移到signar的alpha版本。net core 2.0应用程序。阻碍因素是我们不能再使用这种方法来获得myVar1和myVar2值。不仅查询字符串不可用,而且标头也不可用。克服这种情况的最佳方法是什么,以便能够从客户端应用程序(Typescript)或甚至从客户端应用程序传递变量。net core应用程序到信号服务器端?

    2 回复  |  直到 7 年前
        1
  •  25
  •   Waqas Raja    6 年前

    您可以访问 HttpContext

    var httpContext = Context.Connection.GetHttpContext();
    

    然后使用 httpContext.Request.Query["MyVariable"]

    为ASPNetCore 2.1及更高版本编辑

    GetHttpContext() Context 对象

    using Microsoft.AspNetCore.Http.Connections;
    ....
    var httpContext = Context.GetHttpContext();
    
        2
  •  6
  •   XDS    3 年前

    #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();
        }
    

        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;
        }
    

    希望这有帮助。