簡體   English   中英

SignalR在本地IIS上不起作用,但在IIS Express上起作用

[英]SignalR not working on local IIS but working with IIS Express

我正在嘗試編寫一個小的SignalR項目。 當項目設置為在IIS Express下運行時,一切都會正常進行。

但是,在Visual Studio項目屬性中,我切換到“本地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           

如您所見,當項目在/TestApp/下運行時, /signalr/signalr上調用它的協商。

我怎樣才能告訴它正確的位置(相對)?

編輯

這是我的OwinStartup.cs

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

我在global.asax中沒有定義任何內容-應該嗎?

來自developer82的答案對我來說不是很有效,但是我沒有足夠的意見要發表,所以我將其作為單獨的答案提交。 我需要這樣指定連接:

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

其中,TestApp是虛擬目錄名稱。 請注意,我明確地必須將信號器附加到最后。

切換到本地IIS時遇到了同樣的問題。 通過“ Manage NuGet Packages”升級到signalR-2.2.0之后,我確實閱讀了以下readme.txt:

有關使用SignalR的更多信息,請參閱http://go.microsoft.com/fwlink/?LinkId=272764

從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未定義”? 此問題通常是由於缺少對自動生成的Hub JavaScript代理的腳本引用,該腳本位於'〜/ signalr / hubs'。 請確保已在應用程序中的所有其他路由之前注冊了集線器路由。

在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);            
        }
    }
}

現在,在項目/屬性中,我可以在IIS Express和本地ISS之間切換(用於調試/生產)。

嘗試這個:

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

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

現在,這應該告訴您的應用程序將SignalR進程映射到您/ TestApp的物理位置。 以我的經驗,使用直接的app.MapSignalR(); 大約有30%的時間可用,其余時間,我必須像上面一樣使用顯式的位置聲明。

我發現了一些可以使其工作的東西。 它與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頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM