使用 ClientWebSocket .net 核心测试 TestHost.WebSocketClient

Posted

技术标签:

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

我按照this 和this 或this 教程在.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 问题。 【参考方案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,您需要在测试中设置一些延迟

【讨论】:

以上是关于使用 ClientWebSocket .net 核心测试 TestHost.WebSocketClient的主要内容,如果未能解决你的问题,请参考以下文章

使用 LXD REST API,ClientWebSocket 在 .Net Core 上抛出“AuthenticationException”,但在 .Net Framework 上,它运行良好

System.Net.WebSockets.ClientWebSocket 不能可靠地工作?

.Net Core ClientWebSocket:无法连接到服务器

使用 ClientWebSocket 实现与 Websocket 服务器的安全 (SSL) 连接

Xamarin Mono ClientWebSocket 实现不适用于安全套接字

System.Net.WebSockets 乒乓球