C# PostAsync永远不会在控制台应用程序中返回
我试图实现一个简单的XMLHTTPPOST接口,但不知怎么的,它停止了工作。这是我的代码:C# PostAsync永远不会在控制台应用程序中返回,c#,httpclient,C#,Httpclient,我试图实现一个简单的XMLHTTPPOST接口,但不知怎么的,它停止了工作。这是我的代码: HttpClient _httpClient = new HttpClient(); static void Main(string[] args) { Login("", ""); } public async void Login(string username, string password)
HttpClient _httpClient = new HttpClient();
static void Main(string[] args)
{
Login("", "");
}
public async void Login(string username, string password)
{
var response = await SendXml("<foo>");
}
public async Task<string> SendXml(string xml)
{
var content = new StringContent(xml);
var response = await _httpClient.PostAsync("http://127.0.0.1:8080/Path", content);
var responseBody = await response.Content.ReadAsStringAsync();
return responseBody;
}
HttpClient\u HttpClient=new HttpClient();
静态void Main(字符串[]参数)
{
登录(“,”);
}
公共异步无效登录(字符串用户名、字符串密码)
{
var response=wait SendXml(“”);
}
公共异步任务SendXml(字符串xml)
{
var content=新的StringContent(xml);
var response=wait_httpClient.PostAsync(“http://127.0.0.1:8080/Path“,内容);
var responseBody=await response.Content.ReadAsStringAsync();
返回响应体;
}
我觉得很简单,但在运行时,它只会在PostAsync
处停止。当我在ReadAsStringAsync
上放置断点时,它从未被命中
我没有例外,没有错误,什么都没有。我的服务器显示“发送数据时连接中止”
我一定是做错了什么,但我找不到。。。我必须说,
等待
的东西仍然让我有点困惑。此代码是一个控制台应用程序,异步/等待是否会导致此处出现问题?当您使用基于任务的操作时,需要使应用程序一直异步到应用程序的入口点,通常是Program.Main()
如果使用C#>=7.1,则可以使用
名称空间MyApp
{
公共课程
{
私有只读静态HttpClient _HttpClient=新HttpClient();
公共异步静态任务Main()
{
var response=await SendXml(“myxml”);
}
公共异步静态任务SendXml(字符串xml)
{
var content=新的StringContent(xml);
var response=wait_httpClient.PostAsync(“http://127.0.0.1:8080/Path“,内容);
var responseBody=await response.Content.ReadAsStringAsync();
返回响应体;
}
}
}
如果您使用的是旧版本,则不支持异步入口点,但您可以编写:
namespace MyApp
{
public class Program
{
private readonly static HttpClient _httpClient = new HttpClient();
public static void Main()
{
try
{
MainAsync().GetAwaiter().GetResult();
}
catch (System.Exception)
{
// TODO: log unhandled exception
throw;
}
}
private static Task MainAsync()
{
var response = await SendXml("myxml");
}
public async static Task<string> SendXml(string xml)
{
var content = new StringContent(xml);
var response = await _httpClient.PostAsync("http://127.0.0.1:8080/Path", content);
var responseBody = await response.Content.ReadAsStringAsync();
return responseBody;
}
}
}
名称空间MyApp
{
公共课程
{
私有只读静态HttpClient _HttpClient=新HttpClient();
公共静态void Main()
{
尝试
{
MainAsync().GetAwaiter().GetResult();
}
捕获(系统异常)
{
//TODO:日志未处理的异常
投掷;
}
}
专用静态任务MainAsync()
{
var response=await SendXml(“myxml”);
}
公共异步静态任务SendXml(字符串xml)
{
var content=新的StringContent(xml);
var response=wait_httpClient.PostAsync(“http://127.0.0.1:8080/Path“,内容);
var responseBody=await response.Content.ReadAsStringAsync();
返回响应体;
}
}
}
在最后一种情况下,请确保只有一个调用
GetAwaiter().GetResult()
的点,而不是其他任何地方,因为这可能会导致死锁。Async/await不是问题的原因。您是否尝试指定超时?您是否正在调用调用代码中的任何位置的Task.Result?@Silvermind这可能不是原因,但当我删除它并使用.Result
,它工作正常…不要使用.Result
,因为这可能会导致死锁。您使用的是[StaThread]
?@Silvermind控制台应用程序是否会在收到结果之前结束?我该怎么等呢?在catch(Exception){throw;}
中没有任何意义,因为如果你只是重新播放它,它就等于根本不捕捉。@ckuri我知道。我特意把它放在那里,作为这次行动的指南。
namespace MyApp
{
public class Program
{
private readonly static HttpClient _httpClient = new HttpClient();
public static void Main()
{
try
{
MainAsync().GetAwaiter().GetResult();
}
catch (System.Exception)
{
// TODO: log unhandled exception
throw;
}
}
private static Task MainAsync()
{
var response = await SendXml("myxml");
}
public async static Task<string> SendXml(string xml)
{
var content = new StringContent(xml);
var response = await _httpClient.PostAsync("http://127.0.0.1:8080/Path", content);
var responseBody = await response.Content.ReadAsStringAsync();
return responseBody;
}
}
}