2017-05-12 1 views
0

Ich schreibe ein Nuget-Paket, das eine REST-API verbraucht, die ich geschrieben habe. Ich habe einige Schwierigkeiten, es mit RestSharp asynchron aufzurufen.Async-Web-API-Aktion, die vorzeitig zurückkehrt

Ich habe folgende Controller-Methode:

[HttpGet("{id}")] 
    public async Task<IActionResult> GetFeatureByIdAsync(string id) 
    { 
     if (string.IsNullOrWhiteSpace(id)) 
     { 
      ModelState.AddModelError("id-Null", "The id parameter cannot be null."); 
      return BadRequest(ModelState); 
     } 

     var feature = await _director.GetFeatureById(id); 

     if (feature == null) 
      return NotFound(); 

     var model = new ViewModel<Feature>(feature); 
     return Ok(model); 
    } 

ich die Folgeklassenbibliothek in einer separaten Lösung habe:

public async Task<bool> IsSwitchEnabledAsync(string name) 
    { 
     string fullyFormedUrl = $"{_url}/{name}"; 

     var client = new RestClient(fullyFormedUrl) { Encoding = Encoding.UTF8 }; 

     var request = new RestRequest(Method.GET) { RequestFormat = DataFormat.Json }; 

     var result = await client.ExecuteTaskAsync<FeatureViewModel>(request); 

     var message = $"Response: {result.StatusCode}, {result.ResponseStatus}, " + 
          $"\n\nError: {result.ErrorException}, {result.ErrorMessage} " + 
          $"\n\nData: {result.Content}"; 
     Debug.WriteLine(message); 

     return result.Data != null; 
    } 

Ich habe folgenden Grund Sandbox Integrationstest:

[TestFixture] 
public class Sandbox 
{ 
    private FeatureSwitch _sut; 

    [OneTimeSetUp] 
    public void Setup() 
    { 
     const string machineName = "localhost"; 
     const int port = 5000; 
     _sut = new FeatureSwitch(machineName, port); 
    } 

    [Test] 
    public async Task ShouldReturnTrue() 
    { 
     var result = await _sut.IsSwitchEnabledAsync("Release_US501_AddUser"); 
     result.Should().BeTrue(); 
    } 
} 

Ich bin auf der Suche nach ein wenig Aufklärung über den besten Ansatz, wie man die API nennt korrekt? Wie mein Sandbox-Code mit einem Internal Server 500 Error fehlschlägt. Dies liegt daran, dass die API-Methode darauf wartet, dass der verschachtelte Async-Aufruf abgeschlossen wird. Die ursprüngliche Anfrage kehrt also zum Sandbox-Code zurück, bevor der verschachtelte API-Aufruf abgeschlossen werden kann.

Der Sandbox-Testcode muss warten, bis die API ein Ergebnis zurückgibt. Im Moment macht es das nicht.

Also, was ist der richtige Ansatz hier?

UPDATE:Mein Problem war auf falsche Verwendung einer Mongo-Bibliothek-Methode.

+2

'Dies liegt daran, dass die API-Methode darauf wartet, dass der verschachtelte Async-Aufruf abgeschlossen wird. - Nein, die Antwort wird erst gesendet, wenn die Async-Methode abgeschlossen ist. Es gibt noch etwas, das den Fehler 500 verursacht. –

+3

Ein '500' * typischerweise * bedeutet, dass eine Ausnahme ausgelöst und nicht behandelt wird. Haben Sie die Ausnahme in der Web-API debugged (vorausgesetzt, es gibt eine Ausnahme)? –

+0

Danke Chaps - lass mich weiter drüber nachdenken. – IbrarMumtaz

Antwort

0

Mein Problem kam von einem .chained Methodenaufruf auf einer Methode Mongo Bibliothek:

Ich habe versucht, die folgendes zu tun:

Collection.Find(x => x.Name.ToLower().Equals(name.ToLower()) 

Der Code kompiliert, aber es war zu werfen eine Ausnahme, dass VS Studio 17 brach nicht ab, also hatte ich keine Ahnung, wo das Problem auftrat. Bei aktivierter Code-Linse bemerkte ich, dass die fehlgeschlagenen Anforderungen rot markiert waren. Dies öffnete ein App-Insights-Fenster, das eine Zusammenfassung von 4 InvalidOperationException(), die geworfen worden war, hervorhob. So habe ich herausgefunden, worum es beim Internal Server Error 500 ging.

Wie auch immer ich Async Web API Problem gelöst habe - es war das erste Mal, dass ich es auf einem Webdienst verwendete, also hatte ich keine Ahnung, was das erwartete Standardverhalten sein sollte.