Self-Host SignalR и локальный HTTP-сервер на одном порту

Я хочу разместить самостоятельный процесс SignalR локально на порту 80 и иметь локальный http-каталог, размещенный на том же порту (обслуживание файлов из определенного каталога, сопоставление каталога структура HTTP-запросов).

Например, доступ к localhost:80/index.html вернет html-файл, расположенный в определенном каталоге, который также взаимодействует с процессом SignalR на том же порту, поскольку наличие разных портов вызовет ошибку в браузере Chrome из-за такая же политика происхождения.

Любая идея, как я могу этого достичь? так как я не могу привязать один и тот же порт к двум разным приложениям.


person Aviran Cohen    schedule 21.06.2014    source источник
comment
Обычно, если вы хотите совместно использовать порт между приложениями, вам нужна программа, которая будет привязана к этому порту и направляет запросы соответствующему приложению. На компьютере с Windows такой программой обычно является Internet Information Service (IIS). При размещении нескольких веб-сайтов на порту 80 одного и того же IP-адреса IIS будет направлять запрос на основе имени домена или хоста. Чтобы сделать это на одном и том же имени хоста, вам потребуется иметь обе функции в одном приложении (как указывает Ларс в своем ответе). Вы можете назначить несколько имен хостов одной и той же машине, но я не могу это объяснить.   -  person nbering    schedule 06.09.2014


Ответы (1)


Пока мы говорим о SignalR 2.x, и вы можете обслуживать другой контент через WebAPI, это возможно, поскольку они оба используют OWIN. С MVC все более сложно.

Чтобы запустить SignalR и WebAPI на одном и том же порту, вам необходимо установить Microsoft.AspNet.WebApi.OwinSelfHost в приложении SignalR и изменить Owin.IAppBuilder для использования веб-API:

public static class Startup
{
    public static void Configuration(IAppBuilder app)
    {
        var httpConfig = new HttpConfiguration();
        httpConfig.Routes.MapHttpRoute("Default", "api/{controller}/{id}",
                                       new {id = RouteParameter.Optional});
        app.UseWebApi(httpConfig);

        app.MapSignalR();
    }
}

Обратите внимание, что вы также можете используйте CORS, чтобы обойти эту проблему с браузером.

person Lars Höppner    schedule 22.06.2014