【发布时间】:2020-12-14 21:20:59
【问题描述】:
我的项目是 Owin 自托管的,它提供 Web API 端点和 Web 套接字端点。 这是项目启动类中的相关配置代码 此处使用Owin WebSocket
using Owin;
using Owin.WebSocket.Extensions;
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "api",
routeTemplate: "api/{version}/{controller}"
);
config.EnsureInitialized();
app.MapWebSocketRoute<WebSocket>("/api/v1/socket/test");
app.UseWebApi(config);
}
运行顺利,当应用程序启动时,我可以通过“http://{host}/api/v1/test”使用 web api 并通过以下方式使用 websocket:“ws://{host}/api/ v1/socket/test"
然后我决定添加一些集成测试。我在这里使用Owin Test Server。 TestServer.Create 中的配置是相同的:
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "api",
routeTemplate: "api/{version}/{controller}"
);
config.EnsureInitialized();
app.MapWebSocketRoute<WebSocket>("/api/v1/socket/test");
app.UseWebApi(config);
api的测试方法
var url = new UriBuilder()
{
Scheme = "http",
Path = "/api/v1/test"
}.Uri;;
var result = client.GetAsync(url).Result;
效果很好。但不适用于网络套接字:
var wsUri = new UriBuilder()
{
Scheme = "ws",
Path = "/api/v1/socket/test"
}.Uri;
//create websocket client, connect it and to server
var wsc = new ClientWebSocket();
Task.Run(async () =>
{
await wsc.ConnectAsync(wsUri, CancellationToken.None);
var a = wsc.State; // Here error thrown: No connection could be made because the target machine actively refused it 127.0.0.1:80
}).GetAwaiter().GetResult();
为什么No connection could be made 在这里?似乎测试服务器只能支持常规的http请求而不是websocket。但在使用相同设置和框架的主应用程序中,情况并非如此。我在这里想念什么?我一直在摆弄这个几个小时无济于事......
【问题讨论】:
标签: asp.net websocket integration-testing owin