我应该如何在Windows Phone 7上使用RestSharp实现ExecuteAsync?

我正在尝试使用RestSharp GitHub wiki上的文档来实现对我的REST API服务的调用,但特别是我遇到了ExecuteAsync方法的问题。

目前我的代码对于API类来说是这样的:

public class HarooApi { const string BaseUrl = "https://domain.here"; readonly string _accountSid; readonly string _secretKey; public HarooApi(string accountSid, string secretKey) { _accountSid = accountSid; _secretKey = secretKey; } public T Execute(RestRequest request) where T : new() { var client = new RestClient(); client.BaseUrl = BaseUrl; client.Authenticator = new HttpBasicAuthenticator(_accountSid, _secretKey); request.AddParameter("AccountSid", _accountSid, ParameterType.UrlSegment); client.ExecuteAsync(request, (response) => { return response.Data; }); } } 

我知道这略微偏离了GitHub页面上的内容,但我在WP7中使用它,并且相信该示例是针对C#的,因此使用了ExecuteAsync方法。

我的问题是ExecuteAsync命令应该包含什么。 我不能使用return response.Data因为我被警告:

 'System.Action<RestSharp.RestResponse,RestSharp.RestRequestAsyncHandle>' returns void, a return keyword must not be followed by an object expression 

有没有人对如何解决这个或可能有帮助的教程有任何见解?

您的代码应如下所示:

 public class HarooApi { const string BaseUrl = "https://domain.here"; readonly string _accountSid; readonly string _secretKey; public HarooApi(string accountSid, string secretKey) { _accountSid = accountSid; _secretKey = secretKey; } public void ExecuteAndGetContent(RestRequest request, Action callback) { var client = new RestClient(); client.BaseUrl = BaseUrl; client.Authenticator = new HttpBasicAuthenticator(_accountSid, _secretKey); request.AddParameter("AccountSid", _accountSid, ParameterType.UrlSegment); client.ExecuteAsync(request, response => { callback(response.Content); }); } public void ExecuteAndGetMyClass(RestRequest request, Action callback) { var client = new RestClient(); client.BaseUrl = BaseUrl; client.Authenticator = new HttpBasicAuthenticator(_accountSid, _secretKey); request.AddParameter("AccountSid", _accountSid, ParameterType.UrlSegment); client.ExecuteAsync(request, (response) => { callback(response.Data); }); } } 

我添加了两个方法,因此您可以检查您想要的内容(来自响应主体的字符串内容,或者MyClass在此处表示的反序列化类)

老问题但是如果你使用的是C#5,你可以通过创建一个任务T的任务来完成一个通用的执行类。你的代码看起来像这样:

 public Task ExecuteAsync(RestRequest request) where T : new() { var client = new RestClient(); var taskCompletionSource = new TaskCompletionSource(); client.BaseUrl = BaseUrl; client.Authenticator = new HttpBasicAuthenticator(_accountSid, _secretKey); request.AddParameter("AccountSid", _accountSid, ParameterType.UrlSegment); client.ExecuteAsync(request, (response) => taskCompletionSource.SetResult(response.Data)); return taskCompletionSource.Task; } 

并像这样使用它:

 private async Task DoWork() { var api = new HarooApi("MyAcoountId", "MySecret"); var request = new RestRequest(); var myClass = await api.ExecuteAsync(request); // Do something with myClass } 

作为古斯滕的精细答案的替代(或补充)。 您可以使用ExecuteTaskAsync 。 这样您就不必手动处理TaskCompletionSource 。 请注意签名中的async关键字。

 public async Task ExecuteAsync(RestRequest request) where T : new() { var client = new RestClient(); client.BaseUrl = BaseUrl; client.Authenticator = new HttpBasicAuthenticator(_accountSid, _secretKey); request.AddParameter("AccountSid", _accountSid, ParameterType.UrlSegment); IRestResponse response = await client.ExecuteTaskAsync(request); return response.Data; } 

或者更确切地说是这样的:

  public async Task> ExecuteAsync(IRestRequest request) where T : class, new() { var client = new RestClient(_settingsViewModel.BaseUrl); var taskCompletionSource = new TaskCompletionSource>(); client.ExecuteAsync(request, restResponse => { if (restResponse.ErrorException != null) { const string message = "Error retrieving response."; throw new ApplicationException(message, restResponse.ErrorException); } taskCompletionSource.SetResult(restResponse); }); return await taskCompletionSource.Task; } 

以下完成了这项工作

 public async Task> ExecuteAsync(IRestRequest request) where T : class, new() { var client = new RestClient { BaseUrl = _baseUrl, Authenticator = new HttpBasicAuthenticator(_useraname, _password), Timeout = 3000, }; var tcs = new TaskCompletionSource(); client.ExecuteAsync(request, restResponse => { if (restResponse.ErrorException != null) { const string message = "Error retrieving response."; throw new ApplicationException(message, restResponse.ErrorException); } tcs.SetResult(restResponse.Data); }); return await tcs.Task as IRestResponse; }