Пример приложения Signalr из официальной документации не работает на IIS

Я потратил слишком много времени, пытаясь понять это, и я начинаю исчерпывать потоки здесь, на SO, которые занимаются этой самой проблемой. Не стесняйтесь ссылаться на другие темы по этой проблеме, но я, вероятно, уже консультировался с ними без успеха.

Я следую примеру приложения Microsoft Signalr по этому URL-адресу: https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr

Я использую IIS 8.5 на Windows Server 2012 R2, SignalR 2.2.1 и .Net 4.5.2, и когда я запускаю приложение из Visual Studio, это простое приложение для чата работает, как и ожидалось. Как только я его закидываю на IIS, он ломается (404 для сгенерированного прокси). Ниже приведен код, с которым я работаю, и вывод ошибки.

index.html:

<!DOCTYPE html>
<html>
<head>
    <title>SignalR Simple Chat</title>
    <style type="text/css">
        .container {
            background-color: #99CCFF;
            border: thick solid #808080;
            padding: 20px;
            margin: 20px;
        }
    </style>
</head>
<body>
    <div class="container">
        <input type="text" id="message" />
        <input type="button" id="sendmessage" value="Send" />
        <input type="hidden" id="displayname" />
        <ul id="discussion"></ul>
    </div>
    <!--Script references. -->
    <!--Reference the jQuery library. -->
    <script src="Scripts/jquery-3.1.1.min.js"></script>
    <!--Reference the SignalR library. -->
    <script src="Scripts/jquery.signalR-2.2.1.min.js"></script>
    <!--Reference the autogenerated SignalR hub script. -->
    <script src="signalr/hubs"></script>
    <!--Add script to update the page and send messages.-->
    <script type="text/javascript">
        $(function () {
            // Declare a proxy to reference the hub.
            var chat = $.connection.chatHub;
            // Create a function that the hub can call to broadcast messages.
            chat.client.broadcastMessage = function (name, message) {
                // Html encode display name and message.
                var encodedName = $('<div />').text(name).html();
                var encodedMsg = $('<div />').text(message).html();
                // Add the message to the page.
                $('#discussion').append('<li><strong>' + encodedName
                    + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
            };
            // Get the user name and store it to prepend to messages.
            $('#displayname').val(prompt('Enter your name:', ''));
            // Set initial focus to message input box.
            $('#message').focus();
            // Start the connection.
            $.connection.hub.start().done(function () {
                $('#sendmessage').click(function () {
                    // Call the Send method on the hub.
                    chat.server.send($('#displayname').val(), $('#message').val());
                    // Clear text box and reset focus for next comment.
                    $('#message').val('').focus();
                });
            });
        });
    </script>
</body>
</html>

ChatHub.cs:

using System;
using System.Web;
using Microsoft.AspNet.SignalR;

namespace SOChatApp
{
    public class ChatHub : Hub
    {
        public void Send(string name, string message)
        {
            // Call the broadcastMessage method to update clients.
            Clients.All.broadcastMessage(name, message);
        }
    }
}

Startup.cs:

using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();
        }
    }
}

Ошибка консоли браузера:

Failed to load resource: the server responded with a status of 404 (Not Found), который указывает на http://sub.domain.com/MyApp/signalr/hubs

Мое приложение запустилось как пустое веб-приложение, как указано в демонстрационном приложении, на которое я ссылался в начале этого поста, поэтому проблемы со ссылками на сценарии, связанные с приложениями в стиле MVC, здесь не должны применяться.

Я пробовал много решений, относящихся к Signalr 2. Поскольку я использую IIS 8.5, у меня не должно быть проблем с URL-адресами без расширений. У меня также есть несколько предлагаемых установленных функций в моем IIS, включая протокол WebSocket, хотя мне сказали, что это не обязательно на 100%. Я попытался перезапустить w3svc, перезапустить пул приложений и очистить кэш временных файлов ASP.NET.

Я просто все испортил?

ОБНОВЛЕНИЕ

С обширной помощью @klabranche я решил не использовать очень простой пример учебника, на который я ссылался в верхней части этого вопроса.

Вместо этого он предложил мне попробовать этот учебник здесь: https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr-and-mvc

Следования этому руководству было достаточно, чтобы запустить приложение в IIS. Однако мне пришлось ориентироваться на .net 4.5 вместо 4.5.2.


person Johnny Pints    schedule 14.02.2017    source источник
comment
попробуйте проверить здесь stackoverflow.com/questions/38392489/   -  person Mark    schedule 15.02.2017


Ответы (1)


Ошибка 404 означает, что ваш файл не найден веб-сервером. Вы перешли с локального хоста на сервер, где изменилась относительность ссылки. В ASP.Net относительные пути представлены символом тильды (~/).

Мне кажется, что ваши ссылки на скрипт не являются относительными, и, поскольку вы переместили его на сервер, местоположение не соответствует ожидаемому.

Добавьте ~/ ко всем путям ваших скриптов.

вместо <script src="signalr/hubs"></script> попробуйте ‹script src="~/signalr/hubs"></script>

документы используйте ~/, но, к сожалению, в образце этого нет. Как вы выразились, это будет работать на локальном хосте с IIS Express.

Вы также можете создать прокси-файл. Прочтите раздел «Как создать физический файл для сгенерированного SignalR прокси-сервера», чтобы узнать, как это сделать. Вам не нужно делать это, чтобы заставить SignalR работать, но вы хотели выбросить его туда как еще один вариант.

person Kevin LaBranche    schedule 15.02.2017
comment
Я пробовал это в прошлом, и я только что перепроверил. Это вызывает ошибку 404 против http://sub.domain/MyApp/~/signalr/hubs -- я заметил, что добавление ~/ к путям скрипта устранило проблему для некоторых людей, использующих приложения в стиле MVC, но это приложение, которое я запускаю, не является MVC. - person Johnny Pints; 15.02.2017
comment
~/ это вообще ASP.Net. Работает для WebForms или MVC. Если вы действительно получаете ошибку 404 на sub.domain/myapp/~/signalr/hubs тогда он не преобразует ~/ в относительный путь и фактически использует его как фактический путь. Это говорит мне, что ваше приложение не работает как приложение ASP.Net на сервере. Правильно ли вы настроили параметры приложения IIS? IISExpress и Visual Studio делают это автоматически.... - person Kevin LaBranche; 15.02.2017
comment
Разве это не относится к относительному пути, потому что я на самом деле не использую веб-форму .aspx? Вся работа на стороне клиента находится внутри необработанного html-файла index.html. - person Johnny Pints; 15.02.2017
comment
Но концентратор генерируется DLL C#, которая создается при компиляции во время выполнения посредством отражения. Если ваше приложение не настроено как приложение .NET в IIS, концентратор не будет создан, а синтаксис ~/ не будет распознан и обработан должным образом. Как и в вашем комментарии, IIS буквально ищет папку ~. Кроме того, ваш код концентратора С# никогда не будет выполнен. Неважно, что вы не используете какой-либо веб-формы или синтаксис mvc, иначе — просто необработанный html. Это все еще приложение .Net. - person Kevin LaBranche; 15.02.2017
comment
Например, вы можете сгенерировать свой прокси-сервер, как я упоминал в своем ответе, и изменить свою ссылку, чтобы она указывала на него, как на обычный файл javascript. Однако вы обнаружите, что ваш код C# на стороне сервера никогда не будет выполняться, поскольку мне кажется, что эта папка/приложение IIS не настроена для запуска в качестве приложения .Net. - person Kevin LaBranche; 15.02.2017
comment
Папка MyApp на вашем сервере IIS должна быть приложением (щелкните правой кнопкой мыши папку в диспетчере IIS и выберите «Преобразовать в приложение», а пул приложений, в котором оно работает, должен быть правильной версией .Net. Пула приложений по умолчанию может быть достаточно, но вы необходимо убедиться, что на нем работает правильная версия. Хотя, если это сервер, рекомендуется иметь пул приложений для каждого приложения. Изменение настроек пула приложений по умолчанию повлияет на все приложения, использующие его. Так что делайте это с осторожностью. Это предполагает, что IIS был правильно настроен для запуска приложений Asp.Net. - person Kevin LaBranche; 15.02.2017
comment
Да, я пробовал то, что вы упомянули в своем ответе в прошлом. Я загрузил физический файл для концентраторов, но затем во время переговоров столкнулся с другой ошибкой 404. Что касается остального, я в середине работы над этим. Это очень полезно. - person Johnny Pints; 15.02.2017
comment
Лучший способ выразить это так: у вас возникла проблема с правильным развертыванием образца в IIS с помощью ASP.Net. Образец чрезвычайно простой и не затрагивал ничего из этого. Это хорошо для VS/IIS Express. Я бы искал примеры из реального мира, которые могли бы помочь вам лучше. Я бы использовал начало работы с образцом signalr и asp.net mvc -› docs.microsoft.com/en-us/aspnet/signalr/overview/ в качестве лучшей отправной точки. - person Kevin LaBranche; 15.02.2017
comment
Я, например, только что развернул тот же образец, который вы использовали docs.microsoft.com/en-us/aspnet/signalr/overview/ на один из моих ящиков с уже установленными приложениями SignalR, и он не работает как есть. - person Kevin LaBranche; 15.02.2017
comment
Да, я чувствую, что открыл огромную банку червей, и настройка IIS не входит в число моих сильных сторон. Я знаю, что в прошлом мы запускали приложения asp.net на этом же сервере, используя ту же платформу .net, которую я сейчас пытаюсь использовать, но я чувствую, что вы указали мне правильное направление. - person Johnny Pints; 15.02.2017
comment
Большое спасибо, @klabranche. С помощью примера приложения, которое вы связали по адресу docs.microsoft.com/en-us/aspnet/signalr/overview/ Мне удалось запустить это на IIS, и теперь я могу приступить к моему реальному проекту. - person Johnny Pints; 16.02.2017
comment
@JohnnyPints ​​Отличные новости!!!! Так рад помочь. Ни один человек не является островом. МЫ НУЖНЫ ДРУГ ДРУГУ! Удачи с проектом! :-) - person Kevin LaBranche; 16.02.2017