2014-12-29 13 views
6

Ich habe ein MVC-Projekt, das extern verfügbar gemacht wird. Ich habe ein internes Web-API-Projekt.Erstellen eines MVC-Controller-Proxys für einen Web-API-Controller

Aus Gründen, die ich nicht kontrollieren kann, kann ich das Web-API-Projekt nicht direkt bereitstellen und ich kann meinem MVC-Projekt keine Web-API-Controller hinzufügen.

Ich muss einen MVC-Controller erstellen, der als Proxy für einen Web-API-Controller fungiert. Ich brauche die Antwort vom MVC-Controller, um zu sehen, als ob die Web-API direkt aufgerufen wurde.

Was ist der beste Weg, dies zu erreichen?

Gibt es einen besseren Ansatz als das, was ich bisher habe?

Wie kann ich den Fehler beheben, den ich bekomme? Hier

ist das, was ich bisher:

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; 
    } 

Im MVC-Controller, ich eine InvalidOperationException auf Antrag bin immer .CreateResponse() -Zeile. Der Fehler lautet:

Die Anforderung hat kein zugeordnetes Konfigurationsobjekt oder die angegebene Konfiguration war null.

Jede Hilfe würde sehr geschätzt werden. Ich habe Google und StackOverflow durchsucht, aber ich konnte keine gute Lösung finden, um diesen Proxy zwischen MVC und Web API zu erstellen.

Danke!

Antwort

3

Sie können es tun, indem Sie nur eine JsonResult Aktion in Ihrem Controller erstellen, die das Ergebnis des Aufrufs der Web-API zurückgibt.

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

Würde das nicht immer einen 200 Statuscode zurückgeben? Ich muss den Statuscode der Antwort von der Web-API beibehalten. Außerdem möchte ich nicht, dass die Web-API das Objekt serialisiert, der Proxy-Server wird serialisiert, und das MVC serialisiert das Objekt erneut. – jkruer01

+0

Sie könnten immer Statuscode, den Sie wollen, basierend auf Ergebnis, das Sie von Web API Anruf erreichen – aleha

+0

zurück, was ist mit der Serialisierung, Deserialisierung, Serialisierung erneut Problem? – jkruer01

Verwandte Themen