2017-01-07 3 views
0

Ich versuche die Bibliothek RestSharp.Core in einer .NET Core Anwendung zu implementieren; Aber es hat keine Dokumentation.Unklar darüber, was eine bestimmte Aktion passieren soll <T,R>

Ich muss diese Methode implementieren;

public virtual RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action<IRestResponse, RestRequestAsyncHandle> callback, string httpMethod) 

Ich kann nicht herausfinden, was für den zweiten Parameter übergeben werden. Dies ist der Code, den ich im normalen RestSharp verwendet habe, bevor ich mit der Konvertierung in .NET Core beginnen musste.

var httpResponse = await httpClient.ExecutePostTaskAsync(httpRequest); 
var deserializer = new RestSharp.Deserializers.JsonDeserializer(); 
return deserializer.Deserialize<Dictionary<string, string>>(httpResponse); 

Irgendwelche Ideen? Ich bin wirklich verwirrt.

Antwort

1

RestSharp verwendet eine Callback-ähnliche Art von Asynchronität, die auf anderen Plattformen (z. B. Node) sehr häufig vorkommt, sich aber in .NET nie wirklich durchgesetzt hat.

Um ExecuteAsyncPost implementieren, müssen Sie die request und httpMethod Parameter nehmen einen asynchronen Post starten und dann eine RestRequestAsyncHandle bringe diese Operation darstellt.

Dann, wenn der Beitrag abgeschlossen ist, sollten Sie eine IRestResponse Instanz erstellen und diese zusammen mit der RestRequestAsyncHandle an die callback übergeben. Die RestRequestAsyncHandle, die Sie an callback übergeben, sollte dieselbe Instanz sein wie die, die Sie bereits von ExecuteAsyncPost zurückgegeben haben.

Seit RestRequestAsyncHandle erscheint um HttpWebRequest gebaut zu werden, sollten Sie in der Lage sein, etwas zu tun:

public override RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action<IRestResponse, RestRequestAsyncHandle> callback, string httpMethod) 
{ 
    HttpWebRequest webRequest = /* Construct webRequest from request/httpMethod */ 
    var result = new RestRequestAsyncHandle(webRequest); 
    DoWebRequest(webRequest, result, callback); 
} 

private async void DoWebRequest(HttpWebRequest webRequest, RestRequestAsyncHandle result, Action<IRestResponse, RestRequestAsyncHandle> callback) 
{ 
    IRestResponse response; 
    try 
    { 
    var webResponse = await webRequest.GetResponseAsync().ConfigureAwait(false); 
    response = /* Construct an IRestResponse using webResponse */ 
    } 
    catch (Exception ex) 
    { 
    response = /* Construct an IRestResponse with error information */ 
    } 
    callback(response, result); 
} 

Bitte beachte, dass ich absichtlich async void hier bin mit, weil wir einen Rückruf-basierte asynchrones Systems sind Implementierung, und ich wollen Ausnahmen von der Callback-Methode auf einer obersten Ebene behandelt werden. In der überwiegenden Mehrheit der normalen async/await Verwendung sollten Sie vermeidenasync void.

+0

Vielen Dank, das hat wirklich geholfen. – Ciel

0

Der zweite Parameter ist eine Action (Methode), die eine RestRequestAsyncHandle10 übernimmt und eine IRestResponse zurückgibt.

Mit anderen Worten sucht diese Methode nach einer Methode, die als Rückruf aufgerufen wird, wenn sie fertig ist.

+0

Richtig verstehe ich das. Aber es fällt mir schwer herauszufinden, wie diese Methode aussehen sollte. Ich würde zwar '(request, handler) => {}' funktionieren, aber nicht. – Ciel

+0

Warten Sie ... Sie sagen, es dauert eine und gibt die andere zurück. Das könnte ein bisschen mehr Sinn machen. – Ciel

+0

Ja, Ihre Methode muss etwas zurückgeben. Dein Lambda nimmt beides und kehrt leer zurück. Es wird nicht kompilieren. –

Verwandte Themen