Инициализация HubConnection из TestServer в ASP.NET Core SignalR

Можно ли инициализировать HubConnection из Microsoft.AspNetCore.TestHost.TestServer?

В приведенном ниже примере выдается исключение HttpRequestException(Not Found) в await hubConnection.StartAsync();.

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

person idubnori    schedule 28.02.2018    source источник


Ответы (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;
}

Однако это не будет работать для веб-сокетов (я открыл для этого проблему здесь https://github.com/aspnet/SignalR/issues/1595

person davidfowl    schedule 14.03.2018
comment
Будет ли он подключаться как HTTP (длительный опрос)? Я попробовал это и получил WebSocketException в await hubConnection.StartAsync();. - person idubnori; 14.03.2018
comment
Попробуйте указать события, отправленные сервером, или длительный опрос в качестве типа транспорта. Запасной вариант появится в следующем предварительном просмотре. - person davidfowl; 14.03.2018
comment
Спасибо. Хорошо работал с .WithTransport(TransportType.LongPolling). - person idubnori; 14.03.2018