Я использую 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 (не найдено)
Я пытался настроить 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.
Обновление 3
Это конфигурация сервера, на котором размещены приложения. Вы можете увидеть 3 разных сайта. Все они имеют практически одинаковую конфигурацию. (Только изменение порта, которое определяет 3 разных доступа к тестовой среде)
И это базовый локальный разработчик IIS, который, я думаю, сгенерировал Visual Studio.