微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.Net框架Owin测试服务器不适用于WebSocket

如何解决.Net框架Owin测试服务器不适用于WebSocket

我的项目是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”使用网络api,并通过以下方式使用网络套接字:“ 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;

效果很好。但不适用于Web套接字:

       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。但是,在使用相同设置和框架的主应用程序中并非如此。我在这里想念什么?我已经摆弄了几个小时无济于事...

解决方法

找到了答案。 TestServer.Create<Startup>()仅启动URL不可用的内存中实例。但是,Web套接字客户端依靠url来工作。因此,解决方案是使用过载WebApp.Start<Startup>(Settings.WebApiUrl)(在您提供的URL上启动Web应用程序)

       WebApp.Start(new StartOptions("http://localhost:8989"),startup =>
        {
            startup.MapWebSocketRoute<TestConnection>();
            startup.MapWebSocketRoute<TestConnection>("/ws",sResolver);
            startup.MapWebSocketPattern<TestConnection>("/captures/(?<capture1>.+)/(?<capture2>.+)",sResolver);
        });

Ref

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。