2015-06-08 7 views
12

Sto cercando di implementare socket Web nella mia applicazione che attualmente implementa un'API web RESTful. Voglio che determinate informazioni possano essere esposte da una connessione socket Web, quindi sto cercando di capire come aggiornare una normale richiesta HTTP a una connessione socket web.Conversione di OwinHttpRequestContext in HttpContext? (IHttpHandler e websockets)

Sto cercando di seguire questa tutorial

Il problema che sto avendo è il mio controller che gestisce la richiesta Get eredita da ApiController e sto cercando di fare questo:

if (HttpContext.Current.IsWebSocketRequest) 
    { 
     HttpContext.Current.AcceptWebSocketRequest(SomeFunction); 
    } 
    return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols); 

Il problema è il mio HttpContext.Current è sempre nullo e non so perché. Sembra che non ci sia qualcosa come un HttpContext. Vedo però dalla richiesta che viene loro un HttpRequestContext che arriva con la richiesta. Questi due oggetti sono in qualche modo correlati ed esiste un modo per accedere al metodo .IsWebSocketRequest in modo che possa provare ad aggiornare la richiesta a una connessione socket web?

mio controllore e quello che sto cercando di fare:

[HttpGet] 
    public HttpResponseMessage GetSomething()  
    { 
     if (HttpContext.Current.IsWebSocketRequest()){ 
      Console.WriteLine("web socket request.."); 
     } 
    } 

^HttpContext.Current è sempre nullo. Il mio controller eredita esclusivamente da ApiController

+0

Si sta eseguendo questo in un thread in background? –

+0

Il mio pensiero è che forse quando arriva la richiesta può creare un nuovo thread per quella specifica richiesta, motivo per cui potrebbe essere nullo. Questo è un progetto a cui mi sono appena iscritto quindi non ne sono sicuro. – user3037172

+0

Puoi mostrare il codice per il controller completo? Utilizziamo API Web e ci connettiamo in modo molto simile al tuo codice e HttpContext.Current non è nullo. Inoltre, stai personalizzando la selezione del controller? È possibile che ci sia del codice personalizzato che lo sta mettendo su un thread in background come @Asad menzionato o che potrebbe riutilizzare i controller piuttosto che istanziarne uno nuovo. – ManOVision

risposta

4

Per accedere a Httpcontext in un ApiController MVC utilizzare questo codice.

 if (Request.Properties.ContainsKey("MS_HttpContext")) 
     { 
      HttpContextWrapper HttpContext = (HttpContextWrapper)Request.Properties["MS_HttpContext"]; 
      if (HttpContext != null) 
      { 
       if (HttpContext.IsWebSocketRequest) 
       { 
        HttpContext.AcceptWebSocketRequest(SomeFunction); 
       } 
      } 
     } 

Questo otterrà HttpContext fuori dalla richiesta se viene fornito.

+2

Non contiene "MS_HttpContext". Quelle che vedo in Request.Properties sono "MS_OwinContext", "MS_RequestContext", "MS_HttpConfiguration", "MS_RoutingContext", "MS_HttpRouteData" e altre ancora – user3037172

+0

Hai un riferimento a System.Web? Se non provi ad aggiungerlo al tuo progetto. –

+0

Non cambia nulla. Avere System.Web.Http. – user3037172