2011-02-04 15 views
7

Ho scritto una semplice API REST in WCF e il meccanismo di autenticazione utilizza una chiave API. Una volta che il client invia la chiave API nell'intestazione della richiesta, lo controllo sul lato server (nella classe BaseService override del metodo ProcessRequest() della classe RequestInterceptor) come segue:HttpContext in WCF

public partial class BaseService : RequestInterceptor 
{ 
    public BaseService() : base(false) { } 

    #region Process Request 
    public override void ProcessRequest(ref RequestContext requestContext) 
    { 
     if (IsValidApiKey(requestContext)) 
      //put some values in HttpContext object. 

    } 

...

Ora ho abilitato la compatibilità con aspnet nei miei servizi REST, ma non riesco ancora ad accedere all'oggetto HttpContext nella sovrascrittura ProcessRequest sopra. Si noti che HttpContext è accessibile dall'interno di un metodo di servizio, ma non nel metodo ProcessRequest.

Qualche idea, perché?

risposta

1

Ho risolto il mio problema con l'aggiunta di codice seguente:

private HttpContext _httpContext; 
public BaseService() 
     : base(true) 
    { 
     _httpContext = HttpContext.Current;    

    } 

Dopo aver fatto questo sono in grado di accedere a HttpContext oggetto nel metodo ProcessRequest.

1

HttpContext è probabilmente inizializzato molto più tardi nello stack di canali WCF. Ricordare che un intercettore di canale viene eseguito nella pila di canali prima di qualsiasi altra cosa e subito dopo che il messaggio è stato ricevuto dal listener del canale Http. Di cosa hai bisogno per accedere a HttpContext da un intercettore di richiesta? La richiesta HTTP è disponibile come proprietà nel messaggio associato a requestContext. È inoltre possibile aggiungere alcuni valori nei sacchetti di proprietà disponibili nel messaggio.

Grazie Pablo.

1

Tuttavia si dovrebbe notare che HttpContext.Current non è thread-safe e che cosa è impostato con un thread potrebbe essere modificato da un altro.

Ad esempio due richieste vengono al vostro servizio. Metti un valore a HttpContext in RequestInterceptor per la prima richiesta. La seconda richiesta attende fino a quando la prima richiesta non viene completata con RequestInterceptors. Se la prima richiesta termina con RequestInterceptors e viene passata al servizio, la seconda richiesta immette RequestInterceptors e può accedere all'impostazione HttpContext dalla prima richiesta se la prima richiesta non è terminata. È un tipo di problemi che ho incontrato.

Problemi correlati