2013-12-09 15 views
5

In SignalR, ho esperienza che Context.User si sta improvvisamente trasformando in valore null e talvolta è completamente nullo ma questo non dovrebbe mai accadere perché solo gli utenti autorizzati possono accedere all'hub.Context.User sta cambiando in null stranamente su Signalr

Qual è la ragione di questi strani comportamenti? Sto usando SignalR 2.0 con ASP.NET MVC 4 su Visual Studio 2013.

[Authorize] 
public class FeedHub : Hub 
{   
    public override Task OnConnected() 
    { 
     var name = Context.User.Identity.Name;// here is User is not null 
     var user = GetUser();// but it is changing to null inside this private method 

     return base.OnConnected(); 
    } 

    private User GetUser() 
    { 
     var name = Context.User.Identity.Name;// here is User property is null and throws exception 
     return null;// 
    } 


    public override Task OnDisconnected() 
    { 
     //In here Context.User property is sometimes null but in my opinion this should never be null 
     // because Hub is protected by Authorize attribute. 

     return base.OnDisconnected(); 
    } 
    } 
+0

Sei sicuro di non essere "in attesa" tra quelle due linee? – SLaks

+0

@SLaks che non uso attendo da qualche parte nel codice. – Freshblood

+0

hai trovato una soluzione? Ho affrontato lo stesso problema. Ho trovato qualcosa di interessante qui - http://forums.asp.net/t/1895487.aspx ma non mi aiuta –

risposta

-2

ho usato per il mio progetto Context.ConnectionId SignalR 2.0 e sono molto soddisfatto.

Memorizzando il connid per un static string in questo caso, oppure un per memorizzare gli ID di connessione in ingresso, poiché http non è stateless, ciascun postback eliminerà le informazioni.

public class FeedHub : Hub 

{ 
    static string username = ""; 

    public override Task OnConnected() //event to fire whenever someone joins 
    { 
    var name = Context.ConnectionId;//capture the unique incoming connection id 
    var username = name;//write it into the static string 
    return base.OnConnected(); 
    } 

    public override Task OnDisconnected() //event to fire whenever someone quits 
    { 
    //In here Context.User property is sometimes null because you only recognize authorized users. 
    return base.OnDisconnected(); 
    } 
} 
+0

Si noti che l'uso di campi statici, e soprattutto liste, per memorizzare lo stato lato server è un suggerimento assolutamente terribile e nessuno dovrebbe mai, mai farlo. Database, cache, file, tutti i tipi, ma non quello. –

+0

Sì, questa è solo una pessima idea – 3dd

0

Questo approccio di autenticazione non causerà Context.User.Identity.Name valore nullo sul SignalR 2.0 (https://github.com/tugberkugurlu/SignalRSamples/tree/master/ConnectionMappingSample):

[HttpPost] 
    [ActionName("Login")] 
    public ActionResult PostLogin(LoginModel loginModel) { 

     if (ModelState.IsValid) { 

      FormsAuthentication.SetAuthCookie(loginModel.Name, true); 
      return RedirectToAction("index", "home"); 
     } 

     return View(loginModel); 
    } 

    [HttpPost] 
    [ActionName("SignOut")] 
    public ActionResult PostSignOut() { 

     FormsAuthentication.SignOut(); 
     return RedirectToAction("index", "home"); 
    } 

Tuttavia, ho fatto incontrare Context.User valore nullo quando si utilizza MVC5 Identità modello.

4

Ciò è confermato bug in 2.0.2

https://github.com/SignalR/SignalR/issues/2753

Attualmente è risolto, ma non è incluso nel rilascio ufficiale.

Le opzioni disponibili sono:

  1. Usare sempre cornice o polling lungo (problema si verifica solo quando si utilizzano i socket web) Codice
  2. Prendere da github e costruire i propri binari con correzione inclusa
  3. Attendere 2.0.3. Dovrebbe essere risolto lì.
+0

http://stackoverflow.com/a/21337672/827230 per disabilitare le web socket. – fabspro

+0

http://stackoverflow.com/a/9996047/827230 – fabspro

Problemi correlati