2017-05-16 1 views
0

Ich erhalte die folgende Ausnahme:Wie akzeptiere ich eine Anfrage und gebe eine asynchrone Aufgabe zurück?

Cannot create an EDM model as the action 'Get' on controller 'Accounts' has a return type 'System.Web.Http.IHttpActionResult' that does not implement IEnumerable<T>. 

Beim Versuch, meinen Endpunkt abzufragen:

http://localhost:8267/api/accounts 

Die AccountsController, die die Arbeit tun:

public async Task<IHttpActionResult> Get(ODataQueryOptions options) 
    { 
     var query = options.Request.RequestUri.PathAndQuery; 
     var client = new HttpClient(); 
     var crmEndPoint = @"HTTPS://MYCRMORG.COM/API/DATA/V8.1/"; 
     HttpResponseMessage response = await client.GetAsync(crmEndPoint+query); 
     object result; 
     if (response.IsSuccessStatusCode) 
     { 
      result = await response.Content.ReadAsAsync<object>(); 

      return Ok(result); 
     } 

     return NotFound(); 
    } 

Was ich tue, falsch? Wie füge ich einfach die PathAndQuery zu meinem crmEndPoint hinzu und gebe das Ergebnis zurück?

+1

Sollte nicht die OData Aktionsmethode Gebrauch 'IQueryable ' als Rückgabetyp? –

Antwort

1

Das OData-Framework bietet zusätzliche Antwortformatierungs-/Abfrageregeln zusätzlich zur einfachen Web-API.

Mit ODataQueryOptions Parameter erfordert, dass die Aktionsmethode entweder IQueryable<T> oder IEnumerable<T> zurückgibt.

ODataQueryOptions hilft nur bei der Analyse der eingehenden OData-Anfrage-URL, indem Parameter wie $filter und $sort über Eigenschaften zugänglich gemacht werden.

Ihr Code benötigt diesen Dienst nicht, da er lediglich die Anforderung an die crmEndPoint umleitet. Anstatt also options.Request zu verwenden, können Sie auf das Anforderungsobjekt über die Eigenschaft Request des Controllers zugreifen und den Parameter vollständig löschen.

Hier ist der Code:

public async Task<IHttpActionResult> Get() 
{ 
    var query = Request.RequestUri.PathAndQuery; 
    var client = new HttpClient(); 
    var crmEndPoint = @"HTTPS://MYCRMORG.COM/API/DATA/V8.1/"; 
    HttpResponseMessage response = await client.GetAsync(crmEndPoint + query); 
    object result; 
    if (response.IsSuccessStatusCode) 
    { 
     result = await response.Content.ReadAsAsync<object>(); 

     return Ok(result); 
    } 

    return NotFound(); 
} 
Verwandte Themen