2015-08-20 3 views
2

Я пытаюсь написать небольшой проект SignalR. Когда проект запущен под IIS Express, все работает так, как должно.SignalR не работает на локальном IIS, но работает с IIS Express

Но когда в свойствах проекта Visual Studio я переключаюсь на «Local IIS» и пытаюсь запустить, моя страница загружается и не подключается к SignalR Server.

Я проверил с Fiddler, и я обнаружил, что, хотя весь скрипт загружен правильно относительно пути, вызовы SignalR выполняются в корневом каталоге веб-сайта. Таким образом, в стельку я вижу что-то вроде этого:

3 304 HTTP localhost /TestApp/Scripts/jquery-1.10.2.min.js 0   microsoftedgecp:11004   
4 304 HTTP localhost /TestApp/Scripts/jquery.signalR-2.1.2.min.js 0   microsoftedgecp:11004   
6 404 HTTP localhost /signalr/negotiate?clientProtocol=1.4&connectionData=%5B%7B%22name%22%3A%22testapphub%22%7D%5D&_=1440092162315 4,958 private text/html; charset=utf-8 microsoftedgecp:11004   

Как вы можете видеть, SignalR называет это переговоры о /signalr в то время как проект работает под /TestApp/

Как я могу сказать ему, чтобы посмотреть на то, чтобы исправить местоположение (относительное)?

Редактировать

Это мой OwinStartup.cs:

public void Configuration(IAppBuilder app) 
{ 
    app.MapSignalR(); 
} 

Я никогда ничего определено в global.asax - я должен?

+0

Можете ли вы показать нам файл запуска, в котором вы выполните свою конфигурацию? Вам также нужен звонок в MapHubs в вашем Global.asax - вот что? –

+0

@MichaelMcPherson Я добавил информацию выше. У меня нет ничего определенного в моем global.asax - должен ли я? – developer82

+0

Какое веб-приложение работает? Это пустые веб-приложения, MVC, WebAPI? –

ответ

0

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

После копания в исходном JS файл SignalR Я нашел это функция инициализирует соединение концентратора:

function hubConnection(url, options) { 
    /// <summary>Creates a new hub connection.</summary> 
    /// <param name="url" type="String">[Optional] The hub route url, defaults to "/signalr".</param> 
    /// <param name="options" type="Object">[Optional] Settings to use when creating the hubConnection.</param> 
    var settings = { 
     qs: null, 
     logging: false, 
     useDefaultPath: true 
    }; 

    $.extend(settings, options); 

    if (!url || settings.useDefaultPath) { 
     url = (url || "") + "/signalr"; 
    } 
    return new hubConnection.fn.init(url, settings); 
} 

Как вы можете видеть, это принимает параметр URL. Поэтому, когда я инициализировал свой концентратор со следующим кодом:

var connection = $.hubConnection('/TestApp/'); 

Теперь он работает. Теперь я просто написал простую серверную сторону, которая проверяет погоду, она должна инициализировать этот параметр (если он запущен в подкаталоге) и ввести значение на страницу HTML.

0

Попробуйте это:

public void Configuration(IAppBuilder app) 
    { 
     var hubConfiguration = new HubConfiguration(); 
     hubConfiguration.EnableDetailedErrors = true; 
     hubConfiguration.EnableJavaScriptProxies = true; 

     app.MapSignalR("/TestApp", hubConfiguration); 
    } 

Теперь, что должен сказать свое приложение для отображения процесса SignalR к вашему/TestApp физическое местоположение. По моему опыту, использование прямой app.MapSignalR(); работает около 30% времени, а остальное я должен использовать явное объявление местоположения, как указано выше.

+0

Все еще не работает. Я попробовал отладку, и я заметил, что под IIS OwinStartup не вызывается. – developer82

+0

Является ли пакет 'Microsoft.Owin.Host.SystemWeb' в вашем проекте? Похоже, что IIS [нуждается в этом] (http://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline) для обнаружения Startup. –

+0

Да. Это здесь. – developer82

2

Ответ от разработчика82 не совсем сработал для меня, но у меня недостаточно комментариев, поэтому я представляю его как отдельный ответ. Мне нужно было указать мое подключение следующим образом:

var connection = $.hubConnection('/TestApp/signalr'); 

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

2

Я столкнулся с той же проблемой при переключении на локальный IIS. После обновления до signalR-2.2.0 через «Управление пакетами NuGet» я прочитал этот файл readme.ТХТ:

Please see http://go.microsoft.com/fwlink/?LinkId=272764 for more information on using SignalR.

Upgrading from 1.x to 2.0 Please see http://go.microsoft.com/fwlink/?LinkId=320578 for more information on how to upgrade your SignalR 1.x application to 2.0.

Mapping the Hubs connection To enable SignalR in your application, create a class called Startup with the following:

using Microsoft.Owin; 
using Owin; 
using MyWebApplication; 

namespace MyWebApplication { 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.MapSignalR(); 
     } 
    } 
} 

Getting Started See http://www.asp.net/signalr/overview/getting-started for more information on how to get started.

Why does ~/signalr/hubs return 404 or Why do I get a JavaScript error: 'myhub is undefined'? This issue is generally due to a missing or invalid script reference to the auto-generated Hub JavaScript proxy at '~/signalr/hubs'. Please make sure that the Hub route is registered before any other routes in your application.

In ASP.NET MVC 4 you can do the following:

<script src="~/signalr/hubs"></script> 

If you're writing an ASP.NET MVC 3 application, make sure that you are using Url.Content for your script references:

<script src="@Url.Content("~/signalr/hubs")"></script> 

If you're writing a regular ASP.NET application use ResolveClientUrl for your script references or register them via the ScriptManager using a app root relative path (starting with a '~/'):

<script src='<%: ResolveClientUrl("~/signalr/hubs") %>'></script> 

If the above still doesn't work, you may have an issue with routing and extensionless URLs. To fix this, ensure you have the latest patches installed for IIS and ASP.NET.


Поскольку я работаю на обычное приложение ASP.NET, я должен был изменить это:

<script src="/Scripts/jquery-1.10.2.min.js" ></script> 
<script src="/Scripts/jquery.signalR-2.1.2.js"></script> 
<script src="/signalr/hubs"></script> 

к этому:

<script src='<%: ResolveClientUrl("~/Scripts/jquery-1.10.2.min.js") %'></script> 
<script src='<%: ResolveClientUrl("~/Scripts/jquery.signalR-2.2.0.js") %>'></script> 
<script src='<%: ResolveClientUrl("~/signalr/hubs") %>'></script> 

Ранее я добавил класс «Startup.SignalR.cs»:

using Owin; 
using Microsoft.AspNet.SignalR; 

namespace WebApplication1 
{ 
    public partial class Startup 
    { 
     public void ConfigureSignalR(IAppBuilder app) 
     { 
      app.MapSignalR(); 
     } 
    } 
} 

Мой Startup.cs выглядит следующим образом:

using Microsoft.Owin; 
using Owin; 

[assembly: OwinStartupAttribute(typeof(WebApplication1.Startup))] 
namespace WebApplication1 
{ 
    public partial class Startup { 
     public void Configuration(IAppBuilder app) { 
      //System.Diagnostics.Debugger.Break(); 

      ConfigureSignalR(app); 
      ConfigureAuth(app);    
     } 
    } 
} 

Сейчас в Project/Properties можно переключаться между IIS Express и местным ISS (для отладки/производства).

Смежные вопросы