C# 不清楚通过某个特定操作要传递什么<;T、 R>;
我正在尝试在C# 不清楚通过某个特定操作要传递什么<;T、 R>;,c#,.net-core,restsharp,C#,.net Core,Restsharp,我正在尝试在.netcore应用程序中实现库RestSharp.Core;但它没有文档 我需要实现这个方法 public virtual RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action<IRestResponse, RestRequestAsyncHandle> callback, string httpMethod) 有什么想法吗?我真的很困惑。第二个参数是一个操作(方法),它接受一个Res
.netcore
应用程序中实现库RestSharp.Core
;但它没有文档
我需要实现这个方法
public virtual RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action<IRestResponse, RestRequestAsyncHandle> callback, string httpMethod)
有什么想法吗?我真的很困惑。第二个参数是一个
操作
(方法),它接受一个RestRequestAsyncHandle
,并返回一个IRestResponse
换句话说,此方法正在寻找一种方法,在完成后作为回调调用。RestSharp使用回调样式的异步,这在其他平台(例如Node)中非常常见,但在.NET中从未真正流行 为了实现
ExecuteAsyncPost
,您需要使用请求
和httpMethod
参数来启动异步post,然后返回表示该操作的RestRequestAsyncHandle
然后,当post完成时,您应该构建一个IRestResponse
实例,并将其与RestRequestAsyncHandle
一起传递给回调
。传递给回调的RestRequestAsyncHandle
应与已从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);
}
public override RestRequestAsyncHandle executesyncpost(IRestRequest请求、操作回调、字符串httpMethod)
{
HttpWebRequest webRequest=/*根据请求/httpMethod构造webRequest*/
var result=新的RestRequestAsyncHandle(webRequest);
DoWebRequest(webRequest、结果、回调);
}
私有异步void DoWebRequest(HttpWebRequest webRequest、RestrequeStatAsyncHandle结果、操作回调)
{
iResponse反应;
尝试
{
var webResponse=await webRequest.GetResponseAsync().ConfigureAwait(false);
response=/*使用webResponse构建IRestResponse*/
}
捕获(例外情况除外)
{
response=/*使用错误信息构造IREStreponse*/
}
回调(响应、结果);
}
请注意,我在这里有意使用async void
,因为我们正在实现一个基于回调的异步系统,我希望回调方法的异常能够在顶层处理。在绝大多数正常的async
/wait
使用中,您应该避免async void
对,我理解这一点。但是我很难弄清楚这个方法应该是什么样子。我原以为(请求,处理程序)=>{}
可以工作,但是不行。。。你说它取一个,然后返回另一个。这可能更有意义。是的,您的方法必须返回一些内容。您的lambda同时获取这两个值并返回void。它不会编译的。非常感谢你,这真的很有帮助。
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);
}