2012-08-26 14 views
24

Estoy usando signalr y asp.net MVC3 para construir una aplicación de chat de ejemplo. Así es como se ve mi concentrador de señalizaciónsignalR - getting username

public class MyHub:Hub,IDisconnect 
{ 
public Task Join() 
{ 
    string username = HttpContext.Current.User.Identity.Name; 
    //find group based on username 
    string group = getGroup(username) 
    return Groups.Add(Context.ConnectionId, group); 
} 

public void doStuff() 
{ 
    string group = getGroup(); 
    Clients[group].doStuffOnBrowser(); 
} 
} 

Mi problema es que mi aplicación se cuelga cuando se carga la página. al avanzar con el depurador, descubrí que HttpContext.Current.User.Identity.Name es nulo aunque el usuario ya haya sido autenticado. ¿Cómo puedo obtener el nombre de usuario en mi método Task Join()?

+0

Qué modo de autenticación usa usted (formas, ventanas, etc.)? ¿Estás seguro de que el usuario está autenticado? Porque en una nueva aplicación intranet mvc3, tanto 'HttpContext.Current.User' como' Context.User' no son nulos y contienen el usuario actual. – nemesv

+0

@nemesv - Mi aplicación usa autenticación de formularios y es una aplicación de Internet. Solo se puede acceder a la página que usa el señalizador si el usuario está autenticado. –

+0

Hola @ usuario1, ¿me puede dar una demostración de varias salas de chat usando signalR? Quiero implementar el servidor de chat como chat.stackoverflow.com –

Respuesta

20

Al utilizar SignalR hubs se puede utilizar la propiedad HubCallerContext.User a:

Obtiene el usuario que fue parte de la solicitud HTTP inicial.

lo tanto, tratar con:

public Task Join() 
{ 
    string username = Context.User.Identity.Name; 
    //find group based on username 
    string group = getGroup(username) 
    return Groups.Add(Context.ConnectionId, group); 
} 
+0

cuando escribo HubCallerContext. el intellisense solo muestra 2 métodos: "Igual" y "Referenciaequals". Estoy usando la versión del signalr 0.5.3 –

+0

No, no es necesario que escriba 'HubCallerContext' en lugar de usar la propiedad' Context' del 'Hub' como en mi ejemplo:' string username = this.Context.User.Identity .Name; 'como lo haces con' Context.ConnectionId'. He actualizado mi respuesta para que quede más claro. – nemesv

+3

Probé su fragmento de código pero Context.User.Identity.Name sigue siendo nulo cuando paso por el depurador. ¿Alguna idea? –