SignalR无法在本地IIS上运行,但使用IIS Express

时间:2015-08-20 17:43:18

标签: asp.net iis signalr signalr-hub signalr.client

我正在尝试编写一个小型SignalR项目。当项目设置为在IIS Express下运行时,一切正常。

但是在Visual Studio项目属性中,我切换到“本地IIS”并尝试运行,我的页面加载并且没有连接到SignalR服务器。

我已经和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中没有任何定义 - 我应该吗?

4 个答案:

答案 0 :(得分:2)

developer82的答案对我来说并不合适,但我没有足够的评论点,所以我将其作为一个单独的答案提交。我需要像这样指定我的连接:

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

其中TestApp是虚拟目录名称。请注意,我明确地必须将信号器添加到最后。

答案 1 :(得分:2)

切换到本地IIS时遇到了同样的问题。 通过'Manage NuGet Packages'升级到signalR-2.2.0之后我读了这篇readme.txt:

  

有关详情,请参阅http://go.microsoft.com/fwlink/?LinkId=272764   有关使用SignalR的信息。

     

从1.x升级到2.0   有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=320578   如何将SignalR 1.x应用程序升级到2.0。

     

映射集线器连接   要在应用程序中启用SignalR,请使用以下命令创建一个名为Startup的类:

using Microsoft.Owin;
using Owin; 
using MyWebApplication;

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

使用入门   有关详情,请参阅http://www.asp.net/signalr/overview/getting-started   有关如何入门的信息。

     

为什么〜/ signalr / hubs返回404或为什么我会收到JavaScript错误:   'myhub未定义'?   此问题通常是由于脚本引用丢失或无效   到'〜/ signalr / hubs'的自动生成的Hub JavaScript代理。请   确保Hub路由在任何其他路由之前注册   你的申请。   

在ASP.NET MVC 4 中,您可以执行以下操作:

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

如果您正在编写 ASP.NET MVC 3 应用程序,请确保您使用的是Url.Content   对于您的脚本引用:

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

如果您正在编写常规ASP.NET 应用程序,请使用ResolveClientUrl   脚本引用或使用应用程序通过ScriptManager注册它们   根相对路径(以'〜/'开头):

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

如果上述方法仍无效,则可能是路由问题   和无扩展名的URL。要解决此问题,请确保您拥有最新版本   为IIS和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和Local ISS之间切换(用于调试/生产)。

答案 2 :(得分: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%的时间工作,其余的,我必须使用如上所述的显式位置声明。

答案 3 :(得分:0)

我找到了能让它发挥作用的东西。它与OwinStartup中的映射没有关系(在测试之后我发现它被调用但在调试期间没有被制动)。

在SignalR的js源文件中挖掘后,我发现这个函数初始化了一个集线器连接:

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页面。