【问题标题】:Initializing HubConnection from TestServer in ASP.NET Core SignalR在 ASP.NET Core SignalR 中从 TestServer 初始化 HubConnection
【发布时间】:2018-07-23 16:56:21
【问题描述】:

是否可以从Microsoft.AspNetCore.TestHost.TestServer 初始化HubConnection

下面的示例在await hubConnection.StartAsync(); 处抛出HttpRequestException(Not Found) 异常

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.AspNetCore.TestHost;
using Xunit;

namespace FunctionalTests
{
    public class PubSubScenarios
    {
        [Fact]
        public async Task SignalRHubTest_Foo()
        {
            var webHostBuilder = WebHost.CreateDefaultBuilder().UseStartup<Startup>();

            using (var testServer = new TestServer(webHostBuilder))
            {
                var hubConnection = await StartConnectionAsync(testServer.BaseAddress);                
            }
        }

        private static async Task<HubConnection> StartConnectionAsync(Uri baseUri)
        {
            var hubConnection = new HubConnectionBuilder()
                .WithUrl($"http://{baseUri.Host}/fooHub")
                .WithConsoleLogger()
                .Build();

            await hubConnection.StartAsync();

            return hubConnection;
        }
    }
}

【问题讨论】:

    标签: asp.net-core signalr asp.net-core-signalr


    【解决方案1】:

    您需要调用 testServer.CreateHandler() 并将 HttpMessageHandler 传递给 WithMessageHandler:

    [Fact]
    public async Task SignalRHubTest_Foo()
    {
        var webHostBuilder = WebHost.CreateDefaultBuilder().UseStartup<Startup>();
    
        using (var testServer = new TestServer(webHostBuilder))
        {
            var hubConnection = await StartConnectionAsync(testServer.CreateHandler());                
        }
    }
    
    private static async Task<HubConnection> StartConnectionAsync(HttpMessageHandler handler)
    {
        var hubConnection = new HubConnectionBuilder()
            .WithUrl($"http://test/fooHub", options =>
            {
                options.Transports = HttpTransportType.LongPolling;
                options.HttpMessageHandlerFactory = _ => handler;
            })
            .Build();
    
        await hubConnection.StartAsync();
    
        return hubConnection;
    }
    

    这不适用于 websockets(我在这里打开了一个问题 https://github.com/aspnet/SignalR/issues/1595

    【讨论】:

    • 它会以 HTTP(长轮询)方式连接吗?我试过这个并在await hubConnection.StartAsync();得到WebSocketException
    • 尝试指定服务器发送事件或长轮询作为传输类型。后备功能将在下一个预览版中推出。
    • 谢谢。与.WithTransport(TransportType.LongPolling) 合作良好。
    猜你喜欢
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2017-09-15
    • 2018-05-16
    • 2012-09-21
    相关资源
    最近更新 更多