首页 > 解决方案 > 尝试从 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);
        }
    }
}

我错过了什么?

标签: c#asp.netvisual-studioasync-awaitzendesk-api

解决方案


在某些情况下,异步调用是冷酷的情妇。

一个不错的选择是使您的主程序异步,因此能够等待任务。这里的问题在于 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;
                    }
                }
            }
        }


推荐阅读