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

测试TestHost。带有ClientWebSocket的WebSocketClient。净核心

  •  3
  • MJK  · 技术社区  · 8 年前

    我在中构建了一个WebSocket web应用程序。通过以下方式实现的net core this this this 教程。现在我正试着写一些 集成 使用Microsoft对此进行测试。AspNetCore。测试主机

    我创建WebSocket的方式

    public static WebSocketClient StartWebSocketServer(string url)
    {
        var baseAddress = $"http://{url}";
        var builder =
            WebHost.CreateDefaultBuilder(new string[]{})
                .UseEnvironment("Development")
                .ConfigureLogging((ctx, logging) => logging.AddConsole())
                .UseUrls(baseAddress)
                .UseStartup<SocketsTestStartup>();
    
        var server = new TestServer(builder);
        return server.CreateWebSocketClient();
    }
    

    websocket客户端的创建在下面的代码中完成

    ClientWebSocket testAppClient = new ClientWebSocket();
    await
        testAppClient 
        .ConnectAsync(
            new Uri("ws://loclahost:52015/local"),
            CancellationToken.None);
    

    local 是websocket服务器上的路径名

    app.MapWebSocketManager(
        "/local",
        serviceProvider.GetService<LocalServiceSocketHandler>());
    

    无论如何,连接会产生以下错误

    System.Net.WebSockets.WebSocketException : Unable to connect to the remote server
    

    我的问题是我该怎么问 ClientWebSocket 连接到 TestHost.WebSocketClient ?

    3 回复  |  直到 7 年前
        1
  •  3
  •   Jay    8 年前

    在使用TestServer时,以下内容在我这方面起作用,为了以防万一,它可能会帮助其他人,下面是代码:

    var builder = WebHost.CreateDefaultBuilder()
                    .UseStartup<Startup>()
                    .UseEnvironment("Development");
    
    var server = new TestServer(builder);
    var wsClient = server.CreateWebSocketClient();
    
    var wsUri = new UriBuilder(server.BaseAddress) 
    {
        Scheme = "ws"
    }.Uri;
    
    await wsClient.ConnectAsync(wsUri, CancellationToken.None);
    

    但由于最初的问题是使用路径 /local Path 属性:

    var wsUri = new UriBuilder(server.BaseAddress) 
    {
        Scheme = "ws",
    
        Path = "local"
    }.Uri;
    
        2
  •  3
  •   MJK    8 年前

    我没有使用TestServer,而是使用以下代码来运行WebSocket web应用程序

    public static IWebHost CreateServer(int port)
    {
        var configBuilder = new ConfigurationBuilder();
        configBuilder.AddInMemoryCollection();
        var config = configBuilder.Build();
        config["server.urls"] = $"http://localhost:{port}";
    
        var host = new WebHostBuilder()
            .ConfigureLogging((ctx, logging) => logging.AddDebug())
            .UseConfiguration(config)
            .UseKestrel()
            .UseStartup<SocketsTestStartup>()
            .Build();
    
        host.Start();
    
        return host;
    }
    

    基本上,我已经从 aspnet/WebSockets 测验

        3
  •  0
  •   Roi Shabtai    8 年前

    这段代码在我们开发的企业级应用程序中对我有效(请参阅此处的所有代码: https://github.com/saturn72/Programmer )

    //Create test server    
    var server = new TestServer(builder);
    
    //create websocket client, connect it and to server 
    var wsc = server.CreateWebSocketClient();
    var uri = new Uri(BaseUri, "ws");
    var webSocket = wsc.ConnectAsync(uri, CancellationToken.None).Result;
    var buffer = WebSocket.CreateClientBuffer(1024, 1024);
    
    //Start receive data
    Task.Run(()=> WebSocket.ReceiveAsync(_buffer, CancellationToken.None));
    

    在脑海中是这样的 async 你需要在测试中设置一些延迟