将C#代码更改为Async方法

卡利斯

新成员
已加入
2020年2月4日
留言内容
4
编程经验
Beginner
您好,

我正在使用以下代码以编程方式调用API并清除缓存请求。它按原样工作,但我需要将其更改为福彩12选5走势图方法而不是同步。我尝试使用下面的async..wait方法。你能看一下是否可以。
Sync Method:
using Akamai.EdgeGrid.Auth;
using Newtonsoft.Json;
using System;
using System.IO;
using System.Net;
using System.Configuration;
using System.Text;
using System.Net.Security;
using System.Net.Http;
using System.Threading.Tasks;

namespace AkamaiPurge
{
    class Program
    {
        public class PurgeObject
        {
            [JsonProperty("objects")]
            public string[] Objects { get; set; }
            [JsonProperty("hostname")]
            public string Hostname { get; set; }
        }
        static void Main(string[] args)
        {
            var urlv3 = new PurgeObject();
            string[] paths = System.IO.File.ReadAllLines(@"urlpaths.txt");
            urlv3.Objects = paths;
            Console.WriteLine(paths.Length);
            urlv3.Hostname = "example.com";
            Purge(urlv3);
            Console.ReadLine();
        }
        static WebResponse Purge(PurgeObject purgeObject)
        {
            var client_token = ConfigurationManager.AppSettings["client_token"];
            var access_token = ConfigurationManager.AppSettings["access_token"];
            var secret = ConfigurationManager.AppSettings["secret"];
            var api_url = ConfigurationManager.AppSettings["api_url"];
            var ccu_url = ConfigurationManager.AppSettings["ccu_url"];

            ClientCredential credentials = new ClientCredential(client_token, access_token, secret);
            EdgeGridV1Signer signer = new EdgeGridV1Signer(null, 100000);

            Uri uri = new Uri(api_url + ccu_url);
            WebRequest request = WebRequest.Create(uri);
            request.Method = "POST";
            request.ContentType = "application/json";

            // convert string to stream
            var serializedObject = JsonConvert.SerializeObject(purgeObject);
            Console.WriteLine(serializedObject);
            byte[] byteArray = Encoding.UTF8.GetBytes(serializedObject);
            MemoryStream uploadStream = new MemoryStream(byteArray);

            try
            {
                // Signs the current request using the Akamai C#  library. Creates an Authentication header for the request.
                request = signer.Sign(request, credentials, uploadStream);
            }
            catch (Exception error)
            {
                Console.WriteLine("Error creating signature");
                throw (error);
            }

            // avoid internal memory allocation before buffering the output
            if (request is HttpWebRequest)
                ((HttpWebRequest)request).AllowWriteStreamBuffering = false;

            using (Stream requestStream = request.GetRequestStream())
            using (uploadStream)
                uploadStream.CopyTo(requestStream, 1024 * 1024);
            try
            {
                var httpResponse = (WebResponse)request.GetResponse();
                using (Stream data = httpResponse.GetResponseStream())
                using (var reader = new StreamReader(data))
                {
                    string text = reader.ReadToEnd();
                    Console.WriteLine(text);
                }
                return httpResponse;
            }
            catch (WebException error)
            {
                using (WebResponse response = error.Response)
                {
                    HttpWebResponse httpResponse = (HttpWebResponse)response;
                    Console.WriteLine("Error code: {0}", httpResponse.StatusCode);
                    using (Stream data = response.GetResponseStream())
                    using (var reader = new StreamReader(data))
                    {
                        string text = reader.ReadToEnd();
                        Console.WriteLine(text);
                    }
                }
                return error.Response;
            }
        }
    }
}
Async Method:
using Akamai.EdgeGrid.Auth;
using Newtonsoft.Json;
using System;
using System.IO;
using System.Net;
using System.Configuration;
using System.Text;
using System.Net.Security;
using System.Net.Http;
using System.Threading.Tasks;

namespace AkamaiPurge
{
    class Program
    {
        public class PurgeObject
        {
            [JsonProperty("objects")]
            public string[] Objects { get; set; }
            [JsonProperty("hostname")]
            public string Hostname { get; set; }
        }
        static async Task Main(string[] args)
        {
            var urlv3 = new PurgeObject();
            string[] paths = System.IO.File.ReadAllLines(@"urlpaths.txt");
            urlv3.Objects = paths;
            Console.WriteLine(paths.Length);
            urlv3.Hostname = "example.com";
            await Purge(urlv3);
            Console.ReadLine();
        }
        private static async Task<WebResponse> Purge(PurgeObject purgeObject)
        {
            var client_token = ConfigurationManager.AppSettings["client_token"];
            var access_token = ConfigurationManager.AppSettings["access_token"];
            var secret = ConfigurationManager.AppSettings["secret"];
            var api_url = ConfigurationManager.AppSettings["api_url"];
            var ccu_url = ConfigurationManager.AppSettings["ccu_url"];

            ClientCredential credentials = new ClientCredential(client_token, access_token, secret);
            EdgeGridV1Signer signer = new EdgeGridV1Signer(null, 100000);

            Uri uri = new Uri(api_url + ccu_url);
            WebRequest request = WebRequest.Create(uri);
            request.Method = "POST";
            request.ContentType = "application/json";

            // convert string to stream
            var serializedObject = JsonConvert.SerializeObject(purgeObject);
            Console.WriteLine(serializedObject);
            byte[] byteArray = Encoding.UTF8.GetBytes(serializedObject);
            MemoryStream uploadStream = new MemoryStream(byteArray);

            try
            {
                // Signs the current request using the Akamai C#  library. Creates an Authentication header for the request.
                request = signer.Sign(request, credentials, uploadStream);
            }
            catch (Exception error)
            {
                Console.WriteLine("Error creating signature");
                throw (error);
            }

            // avoid internal memory allocation before buffering the output
            if (request is HttpWebRequest)
                ((HttpWebRequest)request).AllowWriteStreamBuffering = false;

            using (Stream requestStream = request.GetRequestStream())
            using (uploadStream)
                uploadStream.CopyTo(requestStream, 1024 * 1024);
            try
            {
                //var httpResponse = (WebResponse)request.GetResponse();
                var httpResponse = await request.GetResponseAsync();
                using (Stream data = httpResponse.GetResponseStream())
                using (var reader = new StreamReader(data))
                {
                    string text = reader.ReadToEnd();
                    Console.WriteLine(text);
                }
                return httpResponse;
            }
            catch (WebException error)
            {
                using (WebResponse response = error.Response)
                {
                    HttpWebResponse httpResponse = (HttpWebResponse)response;
                    Console.WriteLine("Error code: {0}", httpResponse.StatusCode);
                    using (Stream data = response.GetResponseStream())
                    using (var reader = new StreamReader(data))
                    {
                        string text = reader.ReadToEnd();
                        Console.WriteLine(text);
                    }
                }
                return error.Response;
            }
        }
    }
}
 
由主持人最后编辑:

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,009
位置
挪威
编程经验
10+
insertcode.png
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,486
位置
悉尼,澳大利亚
编程经验
10+
要求我们看看它是否还行不是第一步。第一步是自己测试。这样做是否有效?如果不是这样,显然那是不对的,您应该确切告诉我们实际发生了什么。如果您已经对其进行了测试并且可以正常工作,但是您担心可能没有想到它会失败的情况,那么您需要说明一下。始终提供有关该问题的完整解释。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,469
位置
弗吉尼亚州切萨皮克
编程经验
10+
No it is not okay. All you did was change the call to request.GetResponse() to request.GetResponseAsync() and dealt with the resulting fallout that the compiler started whining about. You did nothing to take full advantage of asynchronous calls. You don't asynchronously read from your text file. You don't asynchronously send your request. You don't asynchronously read your response stream. You don't asynchronously read the error response stream. You don't asynchronously write out to the console.

出于好奇,为什么需要对该程序进行福彩12选5走势图调用。这是一个控制台应用程序,它执行单个请求。这不像您在等待请求处理时阻止用户交互。

出于进一步的好奇,为什么当您可以使用编写更少的代码时,为什么使用较低级别的HttpWebRequest呢? 网络客户端? NVM。看完赤木舞 边缘签名者源代码, it looks like you are forced to use HttpWebRequest due to the nature of their Library/API.

顺便说一句,您对失败请求的异常处理看起来很可疑。但是,如果它对您有用,那就这样吧。
 
Last edited:

卡利斯

新成员
已加入
2020年2月4日
留言内容
4
编程经验
Beginner
要求我们看看它是否还行不是第一步。第一步是自己测试。这样做是否有效?如果不是这样,显然那是不对的,您应该确切告诉我们实际发生了什么。如果您已经对其进行了测试并且可以正常工作,但是您担心可能没有想到它会失败的情况,那么您需要说明一下。始终提供有关该问题的完整解释。
是的,我应该更加清楚。我能够测试,并且工作正常。我怀疑的部分是关于福彩12选5走势图调用的。
 

卡利斯

新成员
已加入
2020年2月4日
留言内容
4
编程经验
Beginner
No it is not okay. All you did was change the call to request.GetResponse() to request.GetResponseAsync() and dealt with the resulting fallout that the compiler started whining about. You did nothing to take full advantage of asynchronous calls. You don't asynchronously read from your text file. You don't asynchronously send your request. You don't asynchronously read your response stream. You don't asynchronously read the error response stream. You don't asynchronously write out to the console.

出于好奇,为什么需要对该程序进行福彩12选5走势图调用。这是一个控制台应用程序,它执行单个请求。这不像您在等待请求处理时阻止用户交互。

出于进一步的好奇,为什么当您可以使用编写更少的代码时,为什么使用较低级别的HttpWebRequest呢? 网络客户端? NVM。看完赤木舞 边缘签名者源代码, it looks like you are forced to use HttpWebRequest due to the nature of their Library/API.

顺便说一句,您对失败请求的异常处理看起来很可疑。但是,如果它对您有用,那就这样吧。
谢谢跳伞运动员。这仅用于测试,并且在生产中每天将有成批的文本文件,因此请求了福彩12选5走势图调用。我知道将一种方法更改为福彩12选5走势图是一种过早的方法,但是我的编码技能只有这么多。我可以轻松地将其传递给其他团队以增强此功能,但我想尝试一下。是的,异常处理在我尝试的方案中按预期工作。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,469
位置
弗吉尼亚州切萨皮克
编程经验
10+
在生产中,它将是一个控制台应用程序吗?还是WPF或Xamarin应用程序?还是Web应用程序?网络服务? Windows服务?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,469
位置
弗吉尼亚州切萨皮克
编程经验
10+
因此,Web应用程序背后的想法是用户将选择一些要删除的路径,然后单击“提交”按钮,或者执行AJAX调用以启动删除。我看不到福彩12选5走势图如何在这种情况下有所帮助,因为用户将不得不等待Akamai完成删除操作的确认。尽管使用async的背后是Web服务器可以在等待Akamai完成删除操作的同时服务其他Web请求吗?如果是这样,您实际上还希望有多少其他用户也在同一服务器上执行Web请求?我想知道这是否是过早优化的情况,或者您的配置文件是否已经确定ASP.NET线程正在等待Akamai进行响应。
 
最佳 底部