【问题标题】:Testing TestHost.WebSocketClient with ClientWebSocket .net core使用 ClientWebSocket .net 核心测试 TestHost.WebSocketClient
【发布时间】:2017-11-17 11:35:17
【问题描述】:

我按照thisthisthis 教程在.net 核心中构建了一个WebSocket Web 应用程序。现在我正在尝试使用 Microsoft.AspNetCore.TestHost 对此编写一些 集成 测试

我创建 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服务器上的路径名

Startup.cs

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

反正连接产生如下错误

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

我的问题是如何让ClientWebSocket 连接到TestHost.WebSocketClient

【问题讨论】:

  • 我怀疑你仍然被困在这里,但我想我应该指出你的网址“loclahost”中的错字。
  • 哈哈 :),感谢@KenLyon 指出
  • 没问题。当我意识到您自己解决了问题时,我实际上正要删除它。我只知道我以前去过那里,当它变得很简单时感觉很糟糕。例如,我试图让 AGES 让 ws: 协议工作,然后最终意识到我必须使用 wss: 因为我的网站是 https。我原以为这是一些晦涩难懂的 MVC 问题。

标签: c# websocket integration-testing clientwebsocket asp.net-core-testhost


【解决方案1】:

使用 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】:

    我使用以下代码而不是 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/WebSocketstests 中找到了解决方案

    【讨论】:

    • 我通常倾向于先检查存储库,看看它们是如何测试的,并像你一样使用它们作为示例。通常,您会找到适合您需求的测试。
    【解决方案3】:

    此代码在我们开发的企业级应用中为我工作(在此处查看所有代码: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,您需要在测试中设置一些延迟

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多