signalR + IIS 404 согласовать клиент angular4 (1.0.0-preview1-final)

Я использую ASP.NET Core 2.0 с Microsoft.AspNetCore.SignalR (1.0.0-preview1-final).

У меня проблема с развертыванием моего приложения с помощью IIS (с Kestrel). Когда я запускаю сервер на локальном хосте с помощью IIS Express, все работает, как и ожидалось, но когда я пытаюсь запустить на IIS (сервер Windows или локальный хост Windows 7), вызов согласования завершается с ошибкой 404

POST http://localhost/notification/negotiate 404 (не найдено)

Содержимое ответа 404

Я пытался настроить IIS с различными темами, найденными в Интернете, но безуспешно. (<modules runAllManagedModulesForAllRequests="true" />, URL-адрес без расширения с https://support.microsoft.com/en-gb/help/980368/a-update-is-available-that-enables-certain-iis-7-0-or-iis-7-5-handlers)

Но я все еще уверен, что проблема связана с моей конфигурацией IIS, поскольку весь проект отлично работает на IIS Express...

Это файл web.config, используемый на тестовом сервере (я удалил различные попытки отладки, так как они не работали...)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\MyProject.Web.App.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
  </system.webServer>
</configuration>
<!--ProjectGuid: {{some GUID here}}-->

Часть кода, используемого в методе Configure

        app.UseSignalR(route =>
        {
            route.MapHub<NotificationHub>("/notification");
        });
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
            routes.MapSpaFallbackRoute(
                name: "spa-fallback",
                defaults: new { controller = "Home", action = "Index" });
        });

Часть кода, используемого в методе ConfigureServices

        services.AddMvc()
        services.AddSignalR();
        services.AddSession();

Угловой код приложения

constructor() {
    /** ... **/

    this.hubConnection = new HubConnection('/notification', {
        transport: TransportType.LongPolling
    });

    this.hubConnection.on('Update', (data: string) => {
        let res = new DefaultNotificationInfo(data);
        /** ... **/
    });

    this.hubConnection.start()
        .then(() => {
            this.join().then(next => {
                // nothing to do on join, the socket is running
            }).catch(error => {
                console.error(error)
            });
        })
        .catch(err => {
            console.error(err)
        });
}

private join(): Promise<any> {
    return this.hubConnection.invoke('Join');
}

Информация о версиях:

IIS: 7.5

Сетевой пакет APP.json:

        {
        /** ... **/
        "@aspnet/signalr": "^1.0.0-preview1-update1",
        "@aspnet/signalr-client": "^1.0.0-alpha2-final",
        /** ... **/
        }

Версия API asp net nuget: (1.0.0-preview1-final)


После прочтения https://blogs.msdn.microsoft.com/webdev/2017/09/14/announcing-signalr-for-asp-net-core-2-0/ и https://blogs.msdn.microsoft.com/webdev/2018/02/27/asp-net-core-2-1-0-preview1-getting-started-with-signalr/, я почти уверен, что я рассмотрел все из их учебника / быстрого старта

Я что-то пропустил?


Обновление 1

Найдя это: https://stackoverflow.com/a/43014264/3198096 я попытался включить свойство LoadUserProfile моего ApplicationPool по этой ссылке https://blogs.msdn.microsoft.com/vijaysk/2009/03/08/iis-7-tip-3-you-can-now-load-the-user-profile-of-the-application-pool-identity/

Но это все еще не соответствует 404.

Я также попытался «Присоединиться к процессу» в своем приложении, чтобы увидеть, есть ли какие-либо журналы, соответствующие моему URL-адресу Hub или /negotiate, но их не было.

(также добавлен снимок экрана с результатом 404)

Обновление 2

Это выдержка package.config из Web.App.

Извлечение файла package.config

Обновление 3

Это конфигурация сервера, на котором размещены приложения. Вы можете увидеть 3 разных сайта. Все они имеют практически одинаковую конфигурацию. (Только изменение порта, которое определяет 3 разных доступа к тестовой среде)

Конфигурация сервера IIS

И это базовый локальный разработчик IIS, который, я думаю, сгенерировал Visual Studio.

Локальная конфигурация IIS


person Humbertda    schedule 21.03.2018    source источник
comment
Можешь выложить код своего хаба? У вас есть аутентификация на месте?   -  person johnny 5    schedule 28.03.2018


Ответы (2)


На github есть очень похожая проблема. Если веб-сайт не размещен в корне (например, с использованием виртуальных каталогов или чего-то подобного), SignalR будет использовать неверный URL-адрес на момент написания. Например, если ваш «сайт-корень» включен

http://YOUR_URL/test/index.html

вам придется использовать

this.hubConnection = new HubConnection('/test/notification', {
    transport: TransportType.LongPolling,
    logger: signalR.LogLevel.Trace
});

Если вышеуказанное не работает, я предлагаю вам добавить ведение журнала в ваше клиентское приложение (как показано выше) и на ваш сервер. Это покажет вам, что именно идет не так.

person Manuel Allenspach    schedule 28.03.2018
comment
Проблема заключалась не в ссылке на виртуальную папку, но проблема с github предложила мне мой ответ. Я не использовал правильный BaseUrl, и поэтому вызов рукопожатия указывал бы на неправильный URL-адрес в IIS (поскольку он не размещен в корневом каталоге)... (Можете ли вы обновить свой ответ, чтобы указать исправление, чтобы я мог предоставить вам щедрость и принять ответ?) - person Humbertda; 28.03.2018
comment
@Humbertda Я пытался обновить объяснение. Рад, что смог указать вам правильное направление. - person Manuel Allenspach; 28.03.2018

Есть ли у вас app.UseSPA() в конвейере ПО промежуточного слоя? если да, попробуйте добавить его после app.UseSignalR() вот так

 app.UseSignalR(routes =>
    {
        routes.MapHub<TestHub>("/hubs/test");
    });

app.UseSpa((o) =>
    {
        if (env.IsDevelopment())
        {
            o.UseProxyToSpaDevelopmentServer("http://localhost:4200");
        }
    });

https://github.com/aspnet/SignalR/issues/1511

person Kahbazi    schedule 27.03.2018
comment
У меня нет промежуточного программного обеспечения UseSpa в проекте, я добавил изображение зависимостей nuget, может быть, мне нужно обновить какой-то пакет, чтобы получить его? - person Humbertda; 27.03.2018
comment
@Кахбази Черт! Последние пару дней я искал в Интернете как сумасшедший, чтобы исправить это. Я прошел через cors и все такое, но это решило мою проблему, приятель... Большое спасибо! Вы спасли мой день!! - person ChiragMS; 13.11.2018