在HTTPTrigger函数中找不到SendGrid

时间:2018-01-15 22:02:20

标签: c# azure azure-functions

我正在尝试创建一个 Azure功能,它将在macOS中使用VSCode进行HTTP攻击。

使用官方documentation,我在本地计算机上成功创建了一个HTTP Trigered azure函数。

现在我想在此功能期间发送电子邮件,但是当我添加 senGrid 引用时,我收到了编译错误:

  

以下1个函数出错:   [15/01/2018 21:51:12] ResetPasswordSendEmail:C#编译服务错误:无法加载文件或程序集“SendGrid,Culture = neutral,PublicKeyToken = null”。该系统找不到指定的文件。   [15/01/2018 21:51:12]。无法加载文件或程序集“SendGrid,Culture = neutral,PublicKeyToken = null”。系统找不到指定的文件。

天蓝色功能:

#r "SendGrid"
#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using SendGrid.Helpers.Mail;

public static IActionResult Run(HttpRequest req, TraceWriter log, out Mail message)
{
    log.Info("C# HTTP trigger function processed a request.");

    string requestBody = new StreamReader(req.Body).ReadToEnd();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    string email = data.email;
    string password = data.password;

    message = new Mail
    {        
        Subject = "Azure news"          
    };

    bool isOk = !string.IsNullOrEmpty(email) && !string.IsNullOrEmpty(password);

    return isOk ? req.CreateResponse(HttpStatusCode.OK) : req.CreateResponse(HttpStatusCode.BadRequest, "EmailError");
}

函数json:

{
    "disabled": false,
    "bindings": [{
            "authLevel": "function",
            "name": "req",
            "type": "httpTrigger",
            "direction": "in"
        },
        {
            "name": "message",
            "type": "sendGrid",
            "direction": "out",
            "apiKey": "AzureWebJobsSendGridApiKey"
        },
        {
            "name": "$return",
            "type": "http",
            "direction": "out"
        }
    ]
}

我希望将代码保留在同一个地方,而不是在代码管理(GIT)之外使用 azure函数

如果有人知道如何解决我的问题,请帮助:D

2 个答案:

答案 0 :(得分:2)

由于您是在Mac上本地开发的,因此您可能正在使用v2"核心" func CLI工具的版本。

导航到项目根文件夹(host.json所在的位置)并执行以下命令:

func extensions install -p Microsoft.Azure.WebJobs.Extensions.SendGrid -v 3.0.0-beta4

这会将SendGrid二进制文件添加到您的功能应用程序的bin文件夹中。

然后,您的脚本似乎是v1和v2函数的混合。例如,CreateResponse()不属于HttpRequestMail类不在SendGrid汇编中。以下是从HTTP函数发送邮件的一个非常简单的示例:

public static IActionResult Run(HttpRequest req, TraceWriter log, out SendGridMessage message)
{
    log.Info("C# HTTP trigger function processed a request.");

    message = new SendGridMessage();
    message.AddTo("you@gmail.com");
    message.AddContent("text/html", "Test body");
    message.SetFrom(new EmailAddress("test@test.com"));
    message.SetSubject("Subject");

    return new OkObjectResult("OK");
}

答案 1 :(得分:0)

根据您的代码和说明,您可能会在门户网站和VScode上创建sendgrid。

这里我创建了HttpTrigger函数并在门户网站上添加了sendgrid,你可以参考下面的代码:

天蓝色功能:

#r "SendGrid"
using SendGrid.Helpers.Mail;
using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log, out Mail message)
{
    log.Info("C# HTTP trigger function processed a request.");
    message = new Mail
    {        
        Subject = "Azure news"          
    };

    var personalization = new Personalization();
    personalization.AddTo(new Email("example@test.com"));   

    Content content = new Content
    {
        Type = "text/plain",
        Value = "msp"
    };
    message.AddContent(content);
    message.AddPersonalization(personalization);
    return req.CreateResponse(HttpStatusCode.OK,"hello");
}

函数json:

{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "sendGrid",
      "name": "message",
      "apiKey": "sendgridkey",
      "from": "example2@test.com",
      "subject": "hello",
      "text": "hello sendgrid",
      "direction": "out"
    }
  ],
  "disabled": false
}

有关更多详细信息,请阅读此article以了解如何在Azure Functions中使用sendgrid。