2014-12-29 15 views
6

Possiedo un progetto MVC esposto esternamente. Ho un progetto Web API interno.Creazione di un proxy controller MVC per un controller API Web

Per ragioni che sfuggono al mio controllo, non posso esporre direttamente il progetto API Web e non riesco ad aggiungere Controller API Web al mio progetto MVC.

Devo creare un controller MVC che funga da proxy per un controller API Web. Ho bisogno che la risposta del controller MVC assuma come se l'API Web venisse chiamata direttamente.

Qual è il modo migliore per realizzare questo?

C'è un approccio migliore di quello che ho finora?

Come posso risolvere l'errore che sto ottenendo?

Ecco quello che ho finora:

MyMVCController

[HttpGet] 
public HttpResponseMessage GetData(HttpRequestMessage request) 
    { 
     ... 

     var response = proxy.GetData(); 

     return request.CreateResponse(); 
    } 

MyProxyClass

public HttpResponseMessage GetData() 
    { 
     ... 
     return HttpRequest(new HttpRequestMessage(HttpMethod.Get, uri)); 
    } 

private HttpResponseMessage HttpRequest(HttpRequestMessage message) 
    { 
     HttpResponseMessage response; 

     ... 

     using (var client = new HttpClient()) 
     { 
      client.Timeout = TimeSpan.FromSeconds(120); 
      response = client.SendAsync(message).Result; 
     } 

     return response; 
    } 

Nel controller MVC, sto ottenendo un InvalidOperationException su richiesta .CreateResponse() line. L'errore indica:

La richiesta non ha un oggetto di configurazione associato o la configurazione fornita era nulla.

Qualsiasi aiuto sarebbe molto apprezzato. Ho cercato su Google e StackOverflow ma non sono riuscito a trovare una buona soluzione per la creazione di questo proxy tra MVC e Web API.

Grazie!

risposta

3

Puoi farlo da solo la creazione di una certa JsonResult azione nel controller che sarà risultato della chiamata web API tornare.

public class HomeController : Controller 
{ 
    public async Task<JsonResult> CallToWebApi() 
    { 
     return this.Content(
      await new WebApiCaller().GetObjectsAsync(), 
      "application/json" 
     ); 
    } 
} 

public class WebApiCaller 
{ 
    readonly string uri = "your url"; 

    public async Task<string> GetObjectsAsync() 
    { 
     using (HttpClient httpClient = new HttpClient()) 
     { 
      return await httpClient.GetStringAsync(uri); 
     } 
    } 
} 
+1

Non restituire sempre un codice di stato 200? Devo conservare qualsiasi codice di stato della risposta dall'API Web. Inoltre, non voglio che l'API Web serializzi l'oggetto, che il proxy lo decodifichi e che l'MVC serializzi di nuovo l'oggetto. – jkruer01

+0

si può sempre tornare codice di stato che si desidera base sul risultato a raggiungere via web API chiamata – aleha

+0

per quanto riguarda il serialize, de-serializzare, serializzare nuovo rilascio? – jkruer01

Problemi correlati