c# - 使用 ClientWebSocket .net 核心测试 TestHost.WebSocketClient

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

我已经按照 this 在 .net 核心中构建了一个 WebSocket Web 应用程序和 thisthis教程。现在我正在尝试使用 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

最佳答案

使用 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;

关于c# - 使用 ClientWebSocket .net 核心测试 TestHost.WebSocketClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47349739/

相关文章:

sql-server - Grails 2.4.4 多个数据源、单独的驱动程序、IntegrationSpec

java - Java一对一消息广播套接字

Java StompSession 发送消息 - Spring Boot

c# - 是否可以创建包含 WPF 库的 Mono 包?

c# - 在 List<T>.Sort() 方法中,项目是否与自身进行了比较?

javascript - 使用node js库Socket io没有端口

grails - 使用元类方法替换后没有方法签名?

ruby-on-rails - 在与 Rails 3.1/Authlogic/ActiveRecord session 存储的集成测试中无法获得授权用户

c# - C#如何获取员工的总休假数

c# - TPL FromAsync 与 TaskScheduler 和 TaskFactory