c# 异步卷曲请求 - 如何访问响应?
c# Async curl request - how do I access the response?
我正在尝试将 curl 请求示例从 API for Jira 转换为 C# 请求。
这是JIRA提供的原始Curl Request示例:
curl \
-D- \
-u charlie:charlie \
-X GET \
-H "Content-Type: application/json" \
http://localhost:8080/rest/api/2/search?jql=assignee=charlie
我已将其翻译成以下 JIRA 代码:
但是响应行不起作用 - 因为我拼凑了几个示例并且有点卡住了!
var myTask = curlRequestAsync(); // call your method which will return control once it hits await
string result = myTask.Result();
// .Result isn't defined - but I'm not sure how to access the response from my request!
任何帮助将不胜感激,因为我真的被困住了!
完整示例:
public partial class WebForm2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var myTask = curlRequestAsync(); // call your method which will return control once it hits await
string result = myTask.Result();
// wait for the task to complete to continue
}
protected async System.Threading.Tasks.Task curlRequestAsync()
{
try
{
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "http://myurl.co.uk/rest/api/2/search?jql=assignee=bob"))
{
var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("username:password"));
request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");
var result = await httpClient.SendAsync(request);
return result;
}
}
}
catch (Exception ex)
{
error.InnerText = ex.Message;
}
}
}
你应该returnTask<System.Net.Http.HttpResponseMessage>
protected async System.Threading.Tasks.Task<HttpResponseMessage> curlRequestAsync()
{
try
{
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "http://myurl.co.uk/rest/api/2/search?jql=assignee=bob"))
{
var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("username:password"));
request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");
var result = await httpClient.SendAsync(request);
return result;
}
}
}
catch (Exception ex)
{
error.InnerText = ex.Message;
}
}
之后您可以访问您的任务的响应:
var myTask = curlRequestAsync();
var result = myTask.Result.Content.ReadAsStringAsync().Result;
由于 async
关键字,您的方法签名,如 "seen by the compiler",在方法范围内被转换:
protected async Task Foo()
会变成
protected void Foo();
要return一个值,用async
关键字,你应该使用这个签名:
protected async Task<T> Foo()
这导致
protected T Foo()
至于来电者,签名保持不变。
在 Task
上,Result
未定义,因为根据其性质,它没有来自任务的 return 值。另一方面 Task<T>
有 一个 Result
.
所以,为了得到一个 "result",(Result
没有在 Task
上定义(Wait
是),你应该使用 Task<T>
,其中定义了 Result
。
在您的情况下,您应该将签名更改为:
protected async System.Threading.Tasks.Task<WhatEverTypeYouAreReturning> curlRequestAsync()
如果您在异步范围内,您现在将能够获得 Result
或 await
调用。后者是首选,因为它会让您的方法保持异步,这对资源的使用有一些好处。
我正在尝试将 curl 请求示例从 API for Jira 转换为 C# 请求。
这是JIRA提供的原始Curl Request示例:
curl \
-D- \
-u charlie:charlie \
-X GET \
-H "Content-Type: application/json" \
http://localhost:8080/rest/api/2/search?jql=assignee=charlie
我已将其翻译成以下 JIRA 代码:
但是响应行不起作用 - 因为我拼凑了几个示例并且有点卡住了!
var myTask = curlRequestAsync(); // call your method which will return control once it hits await
string result = myTask.Result();
// .Result isn't defined - but I'm not sure how to access the response from my request!
任何帮助将不胜感激,因为我真的被困住了!
完整示例:
public partial class WebForm2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var myTask = curlRequestAsync(); // call your method which will return control once it hits await
string result = myTask.Result();
// wait for the task to complete to continue
}
protected async System.Threading.Tasks.Task curlRequestAsync()
{
try
{
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "http://myurl.co.uk/rest/api/2/search?jql=assignee=bob"))
{
var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("username:password"));
request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");
var result = await httpClient.SendAsync(request);
return result;
}
}
}
catch (Exception ex)
{
error.InnerText = ex.Message;
}
}
}
你应该returnTask<System.Net.Http.HttpResponseMessage>
protected async System.Threading.Tasks.Task<HttpResponseMessage> curlRequestAsync()
{
try
{
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "http://myurl.co.uk/rest/api/2/search?jql=assignee=bob"))
{
var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("username:password"));
request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");
var result = await httpClient.SendAsync(request);
return result;
}
}
}
catch (Exception ex)
{
error.InnerText = ex.Message;
}
}
之后您可以访问您的任务的响应:
var myTask = curlRequestAsync();
var result = myTask.Result.Content.ReadAsStringAsync().Result;
由于 async
关键字,您的方法签名,如 "seen by the compiler",在方法范围内被转换:
protected async Task Foo()
会变成
protected void Foo();
要return一个值,用async
关键字,你应该使用这个签名:
protected async Task<T> Foo()
这导致
protected T Foo()
至于来电者,签名保持不变。
在 Task
上,Result
未定义,因为根据其性质,它没有来自任务的 return 值。另一方面 Task<T>
有 一个 Result
.
所以,为了得到一个 "result",(Result
没有在 Task
上定义(Wait
是),你应该使用 Task<T>
,其中定义了 Result
。
在您的情况下,您应该将签名更改为:
protected async System.Threading.Tasks.Task<WhatEverTypeYouAreReturning> curlRequestAsync()
如果您在异步范围内,您现在将能够获得 Result
或 await
调用。后者是首选,因为它会让您的方法保持异步,这对资源的使用有一些好处。