2014-09-11 16 views
5

Avere un endpoint API Web ASP.NET che genera risposte JSON. Ma a causa di due fattori non possono essere consumati direttamente da un browser.Proxy lato server "trasparente" per richieste all'API Web ASP.NET

  1. cross-domain emette
  2. bisogno per fornire ticket di sessione per l'API che è conosciuta lato server solo

quindi ho bisogno di un proxy lato server leggero per client (browser) le domande di estendere la richiesta con chiave di sessione. Non si vuole imporre un overhead di deserializzazione delle richieste JSON del client o di risposte JSON API Web nel codice proxy. Desidera passare il payload "così com'è" e deserializzare le richieste dei client solo lato Web API e le risposte API Web solo lato client (browser). Questo è il proxy prende json dal browser e lo passa direttamente all'API Web. Passa anche la risposta JSON dall'API Web al browser direttamente senza deserializzazione. Solo un proxy fittizio che non sa nulla dei dati che trasferisce. Si prega di suggerire è fattibile e qual è il modo migliore per implementarlo. L'applicazione Web esistente (quella che viene utilizzata per generare le pagine client) viene implementata utilizzando ASP.NET MVC 4.

Grazie in anticipo.

risposta

9

I wrote one for a previous version of WebApi. Il codice dovrebbe essere abbastanza facile da aggiornare per i tuoi scopi.

L'idea di base è che si crea un DelegatingHandler WebAPI che passa la richiesta a un HttpClient:

public class ForwardProxyMessageHandler : DelegatingHandler 
    { 
     protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
     { 
      request.Headers.Add("X-Forwarded-For", request.GetClientIp()); 
      if (request.Method == HttpMethod.Get || request.Method == HttpMethod.Trace) request.Content = null; 
      request.RequestUri = new Uri(request.RequestUri.ToString().Replace(":3002", "")); //comes through with the port for the proxy, rewrite to port 80 
      request.Headers.AcceptEncoding.Clear(); 
      var responseMessage = await new HttpClient().SendAsync(request, HttpCompletionOption.ResponseHeadersRead); 
      responseMessage.Headers.TransferEncodingChunked = null; //throws an error on calls to WebApi results 
      if (request.Method == HttpMethod.Head) responseMessage.Content = null; 
      return responseMessage; 
     } 

    } 
+1

Grazie mille. – AGS

+0

Come si incorpora questo in un controller API Web per un determinato percorso? – Benchik

+0

Penso che dovresti semplicemente registrare la rotta separatamente, piuttosto che come parte di ogni altro controller. – mcintyre321

Problemi correlati