不清楚要通过给定的 Action<T,R>
Unclear about what to pass through a given Action<T,R>
我正在尝试在 .NET Core
应用程序中实现库 RestSharp.Core
;但是它没有文档。
我需要实现这个方法;
public virtual RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action<IRestResponse, RestRequestAsyncHandle> callback, string httpMethod)
我不知道要为第二个参数传递什么。这是我在正常 RestSharp
中使用的代码,然后我不得不开始将其转换为 .NET Core。
var httpResponse = await httpClient.ExecutePostTaskAsync(httpRequest);
var deserializer = new RestSharp.Deserializers.JsonDeserializer();
return deserializer.Deserialize<Dictionary<string, string>>(httpResponse);
有什么想法吗?我真的很困惑。
第二个参数是一个Action
(方法),它接受一个RestRequestAsyncHandle
和returns一个IRestResponse
。
换句话说,这个方法正在寻找一个方法,当它完成时作为回调来调用。
RestSharp 使用回调式异步,这在其他平台(例如 Node)中很常见,但从未在 .NET 中真正流行起来。
为了实现ExecuteAsyncPost
,你需要使用request
和httpMethod
参数来启动异步post 然后 return 一个 RestRequestAsyncHandle
表示该操作。
然后,当 post 完成时,您应该构建一个 IRestResponse
实例并将其与 RestRequestAsyncHandle
一起传递给 callback
。您传递给 callback
的 RestRequestAsyncHandle
应该与您已经 return 从 ExecuteAsyncPost
编辑的实例相同。
由于 RestRequestAsyncHandle
似乎是围绕 HttpWebRequest
构建的,您应该可以执行以下操作:
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);
}
请注意,我在这里故意使用 async void
,因为我们正在实现一个基于回调的异步系统,并且我 希望 回调方法的异常是在顶层处理。在绝大多数正常的async
/await
用法中,你应该避免async void
.
我正在尝试在 .NET Core
应用程序中实现库 RestSharp.Core
;但是它没有文档。
我需要实现这个方法;
public virtual RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action<IRestResponse, RestRequestAsyncHandle> callback, string httpMethod)
我不知道要为第二个参数传递什么。这是我在正常 RestSharp
中使用的代码,然后我不得不开始将其转换为 .NET Core。
var httpResponse = await httpClient.ExecutePostTaskAsync(httpRequest);
var deserializer = new RestSharp.Deserializers.JsonDeserializer();
return deserializer.Deserialize<Dictionary<string, string>>(httpResponse);
有什么想法吗?我真的很困惑。
第二个参数是一个Action
(方法),它接受一个RestRequestAsyncHandle
和returns一个IRestResponse
。
换句话说,这个方法正在寻找一个方法,当它完成时作为回调来调用。
RestSharp 使用回调式异步,这在其他平台(例如 Node)中很常见,但从未在 .NET 中真正流行起来。
为了实现ExecuteAsyncPost
,你需要使用request
和httpMethod
参数来启动异步post 然后 return 一个 RestRequestAsyncHandle
表示该操作。
然后,当 post 完成时,您应该构建一个 IRestResponse
实例并将其与 RestRequestAsyncHandle
一起传递给 callback
。您传递给 callback
的 RestRequestAsyncHandle
应该与您已经 return 从 ExecuteAsyncPost
编辑的实例相同。
由于 RestRequestAsyncHandle
似乎是围绕 HttpWebRequest
构建的,您应该可以执行以下操作:
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);
}
请注意,我在这里故意使用 async void
,因为我们正在实现一个基于回调的异步系统,并且我 希望 回调方法的异常是在顶层处理。在绝大多数正常的async
/await
用法中,你应该避免async void
.