如何 post 使用 async 并使用 HttpClient 等待
How to post with async and await with HttpClient
我正在编写一个 windows 服务以从我的数据库中获取一些数据,然后将其发送给我的提供商并获得响应。我有一些问题让我模拟控制台应用程序来测试我的代码。
这是我的代码:
static async Task Main(string[] args)
{
send();
}
public static DataSet dataAccess()
{
DataSet ds = new DataSet();
ds.Tables.Add();
ds.Tables.Add();
ds.Tables[0].Columns.Add("id");
ds.Tables[0].Columns.Add("token");
ds.Tables[1].Columns.Add("token_id");
ds.Tables[1].Columns.Add("type");
ds.Tables[1].Columns.Add("value");
ds.Tables[0].Rows.Add("1", "token1");
ds.Tables[0].Rows.Add("2", "token2");
ds.Tables[1].Rows.Add("1", "t1", "v1");
ds.Tables[1].Rows.Add("1", "t1", "v2");
ds.Tables[1].Rows.Add("1", "t2", "v3");
ds.Tables[1].Rows.Add("2", "t2", "v4");
ds.Tables[1].Rows.Add("2", "t3", "v5");
ds.Tables[1].Rows.Add("2", "t3", "v6");
ds.Tables[1].Rows.Add("2", "t4", "v7");
ds.Relations.Add("rel_token", ds.Tables[0].Columns["id"], ds.Tables[1].Columns["token_id"]);
return ds;
}
private static async Task send()
{
DataSet ds;
DataTable dt;
while (true)
{
try
{
ds = dataAccess();
if (ds == null)
{
break;
}
List<Task> lst = new List<Task>();
foreach (DataRow dr in ds.Tables[0].Rows)
{
dt = dr.GetChildRows("rel_token").CopyToDataTable();
dt.Columns.Remove("token_id");
lst.Add(send_call((dr["token"]).ToString(), dt));
}
await Task.WhenAll(lst);
await Task.Delay(30000);
}
catch (HttpRequestException e)
{
string erMsg = e.Message;
}
}
}
private static HttpClient req { get; set; }
private static async Task send_call(string strToken, DataTable dt)
{
try
{
// DataTable to Json
string strJson = "";
foreach (DataRow dr in dt.Rows)
{
if (dt.Rows.IndexOf(dr) > 0)
{
strJson += ",";
}
strJson += "{";
foreach (DataColumn dc in dt.Columns)
{
if (dr.IsNull(dc))
{
continue;
}
if (dt.Columns.IndexOf(dc) > 0)
{
strJson += ",";
}
strJson += string.Format("\"{0}\":{1}{2}{1}",
dc.ColumnName,
dc.DataType == typeof(string) || dc.DataType == typeof(Guid) ? "\"" : null,
dc.DataType == typeof(bool) ? dr[dc].ToString().ToLower() : dr[dc]);
}
strJson += "}";
}
//
req.DefaultRequestHeaders.Add("token", strToken);
StringContent sc = new StringContent(strJson, Encoding.UTF8, "application/json");
HttpResponseMessage res = await req.PostAsync("my webhook url", sc);
string response = await res.Content.ReadAsStringAsync();
using (StreamWriter sw = new StreamWriter(@"C:\responseJson.txt", true, Encoding.UTF8))
{
sw.WriteLine(response);
}
}
catch (HttpRequestException e)
{
string strError = e.Message;
}
}
代码解释:
- 我想 post 每个令牌 child 数据分别在每个调用中,
header 值不同。
- 每次
dataAccess()
值都不一样,我就用一个静态数据
用于模拟。
问题:
当我 运行 程序在目标中没有看到请求时,所以我开始调试并注意到指针将到达这一行:
HttpResponseMessage res = await req.PostAsync("my webhook url", sc);
但调用不会启动,之后指针返回:
await Task.WhenAll(lst);
然后得出:
send();
完成了!
所以 PostAsync
方法不起作用,由于 response
没有填充,所以 responseJson.txt
没有创建。
我尝试过的东西:
- 我使用
await send();
而不是 send();
但我遇到了这个错误:
System.NullReferenceException: 'Object reference not set to an
instance of an object.
- 我检查了
strJson
。列表正确转换为 JSON。
- 我已经通过另一个程序检查了我的连接,我可以
致电
my webhook url
.
注:这个问题我昨天问过,但是因为我解释的比较复杂,所以今天删掉了,设计了一个小一点的。
在尝试使用之前创建 HttpClient
,方法是使用 new
关键字。
private static HttpClient req { get; set; } = new HttpClient();
public async Task Main()
{
await send();
}
我正在编写一个 windows 服务以从我的数据库中获取一些数据,然后将其发送给我的提供商并获得响应。我有一些问题让我模拟控制台应用程序来测试我的代码。
这是我的代码:
static async Task Main(string[] args)
{
send();
}
public static DataSet dataAccess()
{
DataSet ds = new DataSet();
ds.Tables.Add();
ds.Tables.Add();
ds.Tables[0].Columns.Add("id");
ds.Tables[0].Columns.Add("token");
ds.Tables[1].Columns.Add("token_id");
ds.Tables[1].Columns.Add("type");
ds.Tables[1].Columns.Add("value");
ds.Tables[0].Rows.Add("1", "token1");
ds.Tables[0].Rows.Add("2", "token2");
ds.Tables[1].Rows.Add("1", "t1", "v1");
ds.Tables[1].Rows.Add("1", "t1", "v2");
ds.Tables[1].Rows.Add("1", "t2", "v3");
ds.Tables[1].Rows.Add("2", "t2", "v4");
ds.Tables[1].Rows.Add("2", "t3", "v5");
ds.Tables[1].Rows.Add("2", "t3", "v6");
ds.Tables[1].Rows.Add("2", "t4", "v7");
ds.Relations.Add("rel_token", ds.Tables[0].Columns["id"], ds.Tables[1].Columns["token_id"]);
return ds;
}
private static async Task send()
{
DataSet ds;
DataTable dt;
while (true)
{
try
{
ds = dataAccess();
if (ds == null)
{
break;
}
List<Task> lst = new List<Task>();
foreach (DataRow dr in ds.Tables[0].Rows)
{
dt = dr.GetChildRows("rel_token").CopyToDataTable();
dt.Columns.Remove("token_id");
lst.Add(send_call((dr["token"]).ToString(), dt));
}
await Task.WhenAll(lst);
await Task.Delay(30000);
}
catch (HttpRequestException e)
{
string erMsg = e.Message;
}
}
}
private static HttpClient req { get; set; }
private static async Task send_call(string strToken, DataTable dt)
{
try
{
// DataTable to Json
string strJson = "";
foreach (DataRow dr in dt.Rows)
{
if (dt.Rows.IndexOf(dr) > 0)
{
strJson += ",";
}
strJson += "{";
foreach (DataColumn dc in dt.Columns)
{
if (dr.IsNull(dc))
{
continue;
}
if (dt.Columns.IndexOf(dc) > 0)
{
strJson += ",";
}
strJson += string.Format("\"{0}\":{1}{2}{1}",
dc.ColumnName,
dc.DataType == typeof(string) || dc.DataType == typeof(Guid) ? "\"" : null,
dc.DataType == typeof(bool) ? dr[dc].ToString().ToLower() : dr[dc]);
}
strJson += "}";
}
//
req.DefaultRequestHeaders.Add("token", strToken);
StringContent sc = new StringContent(strJson, Encoding.UTF8, "application/json");
HttpResponseMessage res = await req.PostAsync("my webhook url", sc);
string response = await res.Content.ReadAsStringAsync();
using (StreamWriter sw = new StreamWriter(@"C:\responseJson.txt", true, Encoding.UTF8))
{
sw.WriteLine(response);
}
}
catch (HttpRequestException e)
{
string strError = e.Message;
}
}
代码解释:
- 我想 post 每个令牌 child 数据分别在每个调用中, header 值不同。
- 每次
dataAccess()
值都不一样,我就用一个静态数据 用于模拟。
问题:
当我 运行 程序在目标中没有看到请求时,所以我开始调试并注意到指针将到达这一行:
HttpResponseMessage res = await req.PostAsync("my webhook url", sc);
但调用不会启动,之后指针返回:
await Task.WhenAll(lst);
然后得出:
send();
完成了!
所以 PostAsync
方法不起作用,由于 response
没有填充,所以 responseJson.txt
没有创建。
我尝试过的东西:
- 我使用
await send();
而不是send();
但我遇到了这个错误:
System.NullReferenceException: 'Object reference not set to an instance of an object.
- 我检查了
strJson
。列表正确转换为 JSON。 - 我已经通过另一个程序检查了我的连接,我可以
致电
my webhook url
.
注:这个问题我昨天问过,但是因为我解释的比较复杂,所以今天删掉了,设计了一个小一点的。
在尝试使用之前创建 HttpClient
,方法是使用 new
关键字。
private static HttpClient req { get; set; } = new HttpClient();
public async Task Main()
{
await send();
}