【问题标题】:How to get SendGrid response status as a string?如何将 SendGrid 响应状态作为字符串获取?
【发布时间】:2019-07-04 12:31:50
【问题描述】:

我在从 SendGrid 检索 HTTP 响应代码,然后根据该响应更新标签时遇到问题。由于 SendGrid 调用使​​用异步方法,我无法返回 response.statuscode;

这是我的代码:

 protected void BtnSend_Click(object sender, EventArgs e)
        {
                lblmsg.InnerText = SendMail(txtEmailId.Text.ToString(), 
                txtMessage.Text.ToString());  //------------

        }




        private String SendMail(String EmailId, String Message)
        {
            var status="";
           Execute(EmailId, Message).Wait();
                  return status;  
        }



   async Task Execute(String EmailId, String Message)
        {
            var apiKey = "abcdefghijklmnopqrstuvwxyz1234567890";
            var client = new SendGridClient(apiKey);
            var from = new EmailAddress("myemail@gmail.com", "Sender");
            var subject = "Testing Email";
            var to = new EmailAddress(EmailId, "Reciever");
            var plainTextContent = "You have recieved this message from me";
            var htmlContent = Message + "<br><i>-Message sent by me</i>";
            var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
            var response = await client.SendEmailAsync(msg).ConfigureAwait(false);
            var status = response.StatusCode;

        }

【问题讨论】:

    标签: c# asynchronous sendgrid


    【解决方案1】:

    您的方法不允许返回值,因为您将其声明为async Task。这意味着它是一个不返回任何内容的 async 方法(它只是返回一个 Task 以便调用者知道它何时完成,但没有实际值)。

    如果您想从async 方法返回某些内容,则需要使用Task&lt;T&gt; 返回类型,其中T 是您要返回的值的类型。

    所以在这种情况下,应该是:

    async Task<HttpStatusCode> Execute(String EmailId, String Message)
    

    那你可以return response.StatusCode

    这里有一些额外的阅读材料可以帮助你更好地理解async 代码:

    【讨论】:

    • 但是如何将它存储在变量中?
    • 和你之前做的一样:var status = await Execute(emailId, message);
    【解决方案2】:

    要从异步方法返回值,必须等待它。请参阅下面的示例方法调用:

    private async Task<System.Net.HttpStatusCode> Execute(String EmailId, String Message)
            {
                var apiKey = "abcdefghijklmnopqrstuvwxyz1234567890";
                var client = new SendGridClient(apiKey);
                var from = new EmailAddress("myemail@gmail.com", "Sender");
                var subject = "Testing Email";
                var to = new EmailAddress(EmailId, "Reciever");
                var plainTextContent = "You have recieved this message from me";
                var htmlContent = Message + "<br><i>-Message sent by me</i>";
                var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
                var response = await client.SendEmailAsync(msg).ConfigureAwait(false);
                return response.StatusCode;
    
            }
    
    private async Task GetStatusCodeExample(String EmailId, String Message)
    {
        var statusCode = await Execute(EmailId, Message);
    }
    

    编辑:

    更新您的代码以使用以下内容以及上述更新的 Execute 方法:

    protected void BtnSend_Click(object sender, EventArgs e)
    {
         lblmsg.InnerText = SendMail(txtEmailId.Text.ToString(), 
         txtMessage.Text.ToString());  //------------
    
    
    private String SendMail(String EmailId, String Message)
    {
         var task = Execute(EmailId, Message);
         task.Wait();
         return ((int)task.Result).ToString();  
    }
    

    【讨论】:

    • 我如何从private async Task GetStatusCodeExample(... 方法中获取状态码?
    • 你不需要!只需使用执行。 private async Task GetStatusCodeExample 只是示例语法,说明如何执行您需要的操作。
    • 请分享您的标签分配代码以获得更多帮助。
    • @stack_user 根据您的最新编辑将代码添加到我的答案中。
    • 它使用 task.status 而不是 task.result ,谢谢
    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多