2013-12-09 20 views
5

W SignalR doświadczam, że Context.User nagle zamienia się w wartość pustą, a także czasami jest całkowicie zerowy, ale to nigdy nie powinno się zdarzyć, ponieważ tylko autoryzowani użytkownicy mogą uzyskać dostęp do koncentratora.Context.User zmienia się na NULL w dziwny sposób na Signalr

Co jest przyczyną tych dziwnych zachowań? Używam SignalR 2.0 z ASP.NET MVC 4 na 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

Czy jesteś pewien, że nie "czekasz" nigdzie pomiędzy tymi dwoma liniami? – SLaks

+0

@SLaks Nie używam czekania w dowolnym miejscu kodu. – Freshblood

+0

znalazłeś rozwiązanie? Mam do czynienia z tym samym problem. Mam znaleźć coś interesującego tutaj - http://forums.asp.net/t/1895487.aspx ale to nie pomaga mi –

Odpowiedz

-2

użyłem Context.ConnectionId dla mojego projektu SignalR 2.0 i jestem bardzo z niego zadowolony.

W tym przypadku przechowywanie konida dla static string lub static List do przechowywania identyfikatorów połączeń przychodzących, ponieważ http jest stanem bezstanowym, każde odświeżenie strony powoduje usunięcie informacji.

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

Pamiętaj, że używanie stanów statycznych, a zwłaszcza list, do przechowywania stanu po stronie serwera jest absolutnie straszną sugestią i nikt nigdy nie powinien tego robić. Baza danych, pamięć podręczna, pliki, wszystkie, ale nie to. –

+0

To tylko straszny pomysł. – 3dd

0

Takie podejście uwierzytelniania nie spowoduje Context.User.Identity.Name zerową wartość na 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"); 
    } 

Jednak Napotkalismy Context.User wartość null podczas korzystania MVC5 Tożsamość Model.

4

Potwierdzają to błąd w wersji 2.0.2

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

Obecnie jest rozwiązany, ale nie ujęte w oficjalnym wydaniu.

wyboru są następujące opcje:

  1. Wykorzystanie Zawsze Frame lub długi Polling (problem występuje tylko wtedy, gdy stosowane są gniazda internetowe)
  2. Weź kod z github i budować swoje własne pliki binarne z poprawki zawartych
  3. Odczekaj 2.0.3. Powinien tam zostać rozstrzygnięty.
+0

http://stackoverflow.com/a/21337672/827230, aby wyłączyć websockets. – fabspro

+0

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

Powiązane problemy