Запускать сообщение SendGrid (Функции Azure) при добавлении таблицы хранения в

У меня есть функция Azure, которая успешно ставит в очередь записи таблицы хранения, как я могу видеть в обозревателе хранилищ Azure.

У меня есть функция Azure, которая успешно отправляет сообщения через SendGrid, и должен срабатывать при добавлении вышеупомянутой очереди, но это не так.

Я предполагаю, что есть проблема с конфигурацией. Они оба находятся в одном приложении-функции и используют одну и ту же строку подключения, но функция SendGrid не запускается. Обе функции сами по себе ванильные, за вычетом изменений моего адреса электронной почты. Есть ли еще какой-нибудь конфиг?

HttpPost (CRUD) -CSharp1

{
  "bindings": [
    {
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ],
      "authLevel": "function"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "type": "table",
      "name": "outTable",
      "tableName": "orders",
      "connection": "matching_connection_string",
      "direction": "out"
    }
  ],
  "disabled": false
}

SendGridCSharp1

{
  "bindings": [
    {
      "type": "sendGrid",
      "name": "message",
      "direction": "out",
      "subject": "",
      "text": ""
    },
    {
      "type": "queueTrigger",
      "name": "order",
      "queueName": "orders",
      "connection": "matching_connection_string",
      "direction": "in"
    }
  ],
  "disabled": false
}

Обновление за ответ @ DAXaholic

DAXaholic предположил, что я пишу в таблицу, но запускаюсь из очереди. Я обновил свою исходящую конфигурацию (изменил последний тип привязки на queue) и получаю сообщение об ошибке о том, что не знаю, какой конструктор использовать: Function ($HttpPOST(CRUD)-CSharp1) Error: Can't figure out which ctor to call. Я попытался изменить пространство имен на Microsoft.WindowsAzure.Storage.Queue, но, похоже, это не дало результата.

Код ниже:

#r "Microsoft.WindowsAzure.Storage"

using System.Net;
using Microsoft.WindowsAzure.Storage.Table;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, ICollector<Order> outTable, TraceWriter log)
{
    var formData = await req.Content.ReadAsFormDataAsync();

    if(string.IsNullOrWhiteSpace(formData.Get("Name")))
    {
        return req.CreateResponse(HttpStatusCode.BadRequest, new {
           error = "no 'Name' property" 
        });
    }

    string name = formData["Name"].ToString();

    outTable.Add(new Order()
    {
        PartitionKey = "Functions",
        RowKey = Guid.NewGuid().ToString(),
        OrderId = string.Format("order{0}", name),
        CustomerName = name,
        CustomerEmail = string.Format("{0}@{1}.com", name, name)
    });
    return req.CreateResponse(HttpStatusCode.Created);
}

public class Order : TableEntity
{
    public string OrderId { get; set; }
    public string CustomerName { get; set; }
    public string CustomerEmail { get; set; }
}

person David Fox    schedule 13.09.2016    source источник


Ответы (1)


Я предполагаю, что проблема в том, что ваш триггер основан на очереди хранилища Azure, но вы пишете в таблицу хранилища Azure, поэтому первый не срабатывает. Тем не менее, попробуйте заменить исходящую привязку к таблице хранилища Azure привязкой к соответствующей очереди, например так (см. здесь для справки)

{
  "bindings": [
    {
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ],
      "authLevel": "function"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "type": "queue",
      "name": "outTable",
      "queueName": "orders",
      "connection": "matching_connection_string",
      "direction": "out"
    }
  ],
  "disabled": false
}

Обновите исходящий код до:

#r "Microsoft.WindowsAzure.Storage"

using System.Net;
using Microsoft.WindowsAzure.Storage.Queue;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, ICollector<Order> outQueue, TraceWriter log)
{
    var formData = await req.Content.ReadAsFormDataAsync();

    if(string.IsNullOrWhiteSpace(formData.Get("Name")))
    {
        return req.CreateResponse(HttpStatusCode.BadRequest, new {
           error = "no 'Name' property" 
        });
    }

    string name = formData["Name"].ToString();

    outQueue.Add(new Order()
    {
        OrderId = string.Format("order{0}", name),
        CustomerName = name,
        CustomerEmail = string.Format("{0}@{1}.com", name, name)
    });
    return req.CreateResponse(HttpStatusCode.Created);
}

public class Order
{
    public string OrderId { get; set; }
    public string CustomerName { get; set; }
    public string CustomerEmail { get; set; }
}
person DAXaholic    schedule 13.09.2016
comment
Думаю, в этом есть смысл. Я обновил конфигурацию, и появилась новая ошибка о том, что я не знаю, какой конструктор использовать (см. Обновленный пост). - person David Fox; 13.09.2016
comment
Конечно, вам нужно изменить свой код, чтобы писать не сущности таблицы хранилища Azure, а элементы очереди - для этого см. Их документацию azure.microsoft.com/en-us/documentation/articles/ - person DAXaholic; 13.09.2016
comment
В разделе Azure Storage queue output binding для записи сообщения используется триггер очереди, но я использую триггер HTTP post (или пытаюсь это сделать). Я не уверен, что могу связать свой вариант использования с документацией. - person David Fox; 13.09.2016
comment
Итак, ваша текущая проблема связана с исходящей привязкой, которую вы изначально написали для таблицы хранилища Azure, но теперь она предназначена для очереди хранилища Azure, поэтому пример должен соответствовать вашему варианту использования, поскольку триггер, строго говоря, не имеет отношения к вашей проблеме. - person DAXaholic; 13.09.2016
comment
Попробуйте удалить наследование от TableEntity в вашем Order классе, поскольку вы больше не записываете в таблицу хранилища Azure. - person DAXaholic; 13.09.2016
comment
Успешно справился. Я обновил ваш ответ изменениями кода, которые в итоге сработали! - person David Fox; 13.09.2016
comment
Приятно слышать! - person DAXaholic; 13.09.2016