使用 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) 连接