c# - 尝试从 VS2019 中的控制台应用程序调用简单的 POST API
问题描述
我正在尝试调用简单的方法从控制台应用程序POST API
创建Zendesk
票证。我在其中创建了 C# 核心控制台应用程序VS2019
并粘贴了应该创建新票证的简单代码。代码在其他应用程序中工作,但在控制台应用程序中,应用程序只是从调试中注销......
调用永远不会......
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://testhelp.zendesk.com/api/v2/tickets.json"))
{
try
{
var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("test@test.com:testPassword"));
request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");
request.Content = new StringContent("{\"ticket\": {\"subject\": \"My first Ticket!\", \"comment\": { \"body\": \"The ticket is from API.\" }}}");
request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
HttpResponseMessage response = await httpClient.SendAsync(request).ConfigureAwait(false);
string content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
Console.WriteLine(response);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
我错过了什么?
解决方案
在某些情况下,异步调用是冷酷的情妇。
一个不错的选择是使您的主程序异步,因此能够等待任务。这里的问题在于 GUI,如果这是您离开命令行时实际拥有的东西,我不确定它与 UI 线程的性能如何,但这里是示例。哪个更优雅。
static async Task Main(string[] args)
{
var TicketTask = await createTicket();
}
async static Task<string> createTicket()
{
var content = "unknown error";
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://testhelp.zendesk.com/api/v2/tickets.json"))
{
try
{
var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("test@test.com:testPassword"));
request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");
request.Content = new StringContent("{\"ticket\": {\"subject\": \"My first Ticket!\", \"comment\": { \"body\": \"The ticket is from API.\" }}}");
request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
HttpResponseMessage response = await httpClient.SendAsync(request).ConfigureAwait(false);
content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
//Console.WriteLine(response);
}
catch (Exception ex)
{
content = ex.Message;
}
}
}
return content;
}
Quick-and-dirty-simple-solution(我不建议将其用于生产)是将主循环中的内容作为全局变量进行监控,您可以在其中填充成功或失败。
static string content = "";
static void Main(string[] args)
{
var loopcount = 0;
var t = new Task(createTicket);
t.Start();
while(content == "" && loopcount < 50000)
{
System.Threading.Thread.Sleep(100);
loopcount++;
}
}
async static void createTicket()
{
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://testhelp.zendesk.com/api/v2/tickets.json"))
{
try
{
var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("test@test.com:testPassword"));
request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");
request.Content = new StringContent("{\"ticket\": {\"subject\": \"My first Ticket!\", \"comment\": { \"body\": \"The ticket is from API.\" }}}");
request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
HttpResponseMessage response = await httpClient.SendAsync(request).ConfigureAwait(false);
content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
//Console.WriteLine(response);
}
catch (Exception ex)
{
content = ex.mesage;
}
}
}
}
推荐阅读
- ibm-cloud - Node-RED 显示已连接,但在 IoT 平台上显示已断开连接
- cmake - CMake 错误:安装 Trilinos 时出现未知参数 -VV
- heroku - 部署到 Heroku 时未应用按钮样式
- reactjs - useSelector() 不会在更新时重新渲染组件
- python - 在 Python 中使用 Prince 进行多重对应分析 - 无法让库运行
- java - 使用 Angular 将表单对象传递给 http delete 方法
- for-loop - 如何对具有二项式协变量数据的模型进行循环线性回归?
- angular - FormGroup 验证器
- owin - 使用 Owin Starup 的 ASP.Net 表单中的授权代码流错误
- spring-boot - Spring boot:我需要几行代码的解释