2014-11-05 15 views
5

SignalR funzionava mentre il progetto era ASP.NET MVC3. Ora l'ho aggiornato a MVC5 (non è così facile da fare, devo dirtelo)./signalr/hub 404 non trovato dopo l'aggiornamento a MVC5

Poi ho notato che signalR non funzionava. Ho seguito il libro, reinstallato SignalR alla versione 2.1.0, installato OWIN (must-have per v2 +) e aggiunto la classe di avvio al progetto.

Questa è la mia classe startup.cs, si siede alla cartella principale del progetto:

[assembly: OwinStartup(typeof(SISTEM.Startup))] 
namespace SISTEM 
{ 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.MapSignalR(); 
     } 
    } 
} 

non vedo alcun problema qui, ma forse mi manca qualcosa ...

Ora qui è frammento il mozzo:

namespace SISTEM 
{ 
    public class PostingHub : Hub 
    { 
     public void Test(string hello) 
     { 
      Clients.All.hello(hello); 
     } 
    } 
} 

proxys Poi i riferimento generato in vista:

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

L'ho ispezionato nel fiddler e posso vedere che la richiesta/signalr/hubs sta generando HTTP 404 non trovata.

Ora, non ero pigro, ho provato diverse cose:

  • Patch IIS per gli URL senza estensione - Non dovrebbe essere un problema dal momento che sto usando Win8
  • RouteTable.Routes.MapHubs
  • chiamata() prima di RegisterRoutes (RouteTable.Routes) - VS non lo consentirà. Mi dà un errore dicendo che è obsoleto, usa OWIN.
  • Strumento scaricato per la generazione di proxy javascript (SignarR Utils), in modo da poterli consultare manualmente in seguito. Ho cercato di generare, senza errori, ma generato js era vuoto. Ho provato diverse volte. Questo è stato per me più interessante. Forse per qualche motivo il proxy non può essere generato.

Qualsiasi aiuto sarebbe apprezzato.

UPDATE: risposta da/signalr/hub

<!DOCTYPE html> 
<html> 
<head> 
    <title>The resource cannot be found.</title> 
    <meta name="viewport" content="width=device-width" /> 
</head> 

<body bgcolor="white"> 

     <span><H1>Server Error in '/' Application.<hr width=100% size=1 color=silver></H1> 

     <h2> <i>The resource cannot be found.</i> </h2></span> 

     <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif "> 

     <b> Description: </b>HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. &nbsp;Please review the following URL and make sure that it is spelled correctly. 
     <br><br> 

     <b> Requested URL: </b>/signalr/hubs<br><br> 

     <hr width=100% size=1 color=silver> 

     <b>Version Information:</b>&nbsp;Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.34212 

     </font> 

</body> 

[HttpException]: The controller for path &#39;/signalr/hubs&#39; was not found or does not implement IController. 
at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) 
at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) 
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) 
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) 
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) 
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 
+0

Ha colpito questa riga "app.MapSignalR();"? –

+0

No, non lo è. Buon punto Se la linea viene colpita all'avvio dell'app? –

+0

Sì, altrimenti non eseguirà il mapping del percorso del segnale, per fare in modo che signalR funzioni deve raggiungere questa linea all'avvio dell'applicazione. Controlla il tuo file di configurazione, se ti manca qualcosa relativo a OWIN. –

risposta

8

È necessario installare il pacchetto Microsoft.Owin.Host.SystemWeb nel progetto

verificare questo link

Se il pacchetto non è installato, installare il seguente pac Kage dalla Console Package Manager (PMC):

Installare-Pacchetto Microsoft.Owin.Host.SystemWeb

UPDATE

Si dice che puramente, non è in grado di rilevare la vostra classe startup, ecco alcuni risultati in più.

  • Credo che questa chiave non è più è presente nel file di configurazione <add key="owin:AutomaticAppStartup" value="false" />
  • L'applicazione potrebbe essere memorizzata nella cache nella cartella Temp, provare a eliminare i file temporanei per l'applicazione. (Vai a correre>% TEMP%> CTRL + A > Elimina)

Questo dovrebbe funzionare, in caso contrario, provare a creare signalR in un progetto di esempio.

+1

no fortuna. Ho reinstallato Microsoft.Owin.Host.SystemWeb dalla versione 2 alla versione 3 ma non è cambiato nulla. Aggiornerò il mio post per vedere la risposta alla richiesta/signalr/hubs. app.MapSignalR(); ancora non viene colpito. –

+1

controllare questo link http://blogs.msdn.com/b/praburaj/archive/2013/12/02/owin-startup-class-not-detected.aspx E http: //www.asp .net/aspnet/overview/owin-and-katana/owin-startup-class-detection –

+2

La cancellazione della cartella temporanea era il 90% della soluzione. Ha iniziato a colpire app.MapSignalR(); dopo di che. C'era un altro problema di dipendenza dopo quello, ma non era un problema reale. Grazie per tutto il vostro aiuto. –

3

Come ha detto Milos, la cartella temp di compensazione risolverà probabilmente il problema. Ho creato uno script per fare questo, che io chiamo powerreset.cmd che dovrebbe essere eseguito come amministratore:

@echo off 
@iisreset /stop 
@robocopy e:\empty "C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files" /PURGE 
@robocopy e:\empty "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files" /PURGE 
@iisreset /start 

E: \ cartella vuota, che sarà la fonte, e l'utilizzo di spurgo con robocopy dovrebbe quindi chiaro i file temporanei.

0

Le versioni di SignalR js devono essere uguali, ma possono essere diverse. Come effetto collaterale troverai questo errore nella console del browser.

Controllare la versione della libreria SignalR nella cartella Scripts e quella a cui si fa riferimento nella vista.

  • ~/Scripts/jquery.signalR-2.1.0.min.js (SignalR tutorial);
  • jquery.signalR-2.2.1.min.js viene installato nella cartella degli script (installazione di nuget: pacchetto di installazione Microsoft.AspNet.SignalR).

A volte le cose più evidenti vengono lasciate inosservate.

Problemi correlati