Как функция httptrigger в выводе портала в тему служебной шины

Я новые лазурные функции. Я создал триггерную функцию лазурного HTTP на лазурном портале. Я хочу вывести сообщение в тему служебной шины.

Вот моя функция httptrigger на портале:

#load "..\sharedcode\DeleteCommandRequest.csx"

#r "Newtonsoft.Json"
#r "Microsoft.ServiceBus"

using System.Net;
using Newtonsoft.Json;
using Microsoft.ServiceBus
using Microsoft.ServiceBus.Messaging;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, 
    TraceWriter log,
    ServiceBus outputSbMsg)
{
    log.Info("C# HTTP trigger function processed a request.");

    DeleteCommandRequest request = await req.Content.ReadAsAsync<DeleteCommandRequest>();

    log.Info($"Delete command recevied: {request.SagaId} {request.Action} {request.RequestId}");

    var message = new BrokeredMessage(JsonConvert.SerializeObject(request));
    outputSbMsg.send(message);

    return request == null
        ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass the correct request body")
        : req.CreateResponse(HttpStatusCode.OK, "Hello " + JsonConvert.SerializeObject(request));
}

Я получаю следующую ошибку:

error CS0246: The type or namespace name 'ServiceBus' could not be found (are you missing a using directive or an assembly reference?)

Может ли кто-нибудь помочь, как вывести брокерское сообщение в тему служебной шины из httptrigger?

Я также пробовал использовать предварительно скомпилированную функцию azure VS2017:

[FunctionName("DeleteCase")]
public static async Task<HttpResponseMessage> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)]
    HttpRequestMessage req,
    [ServiceBus("cqrs-commands", EntityType = EntityType.Topic)]
    IAsyncCollector<BrokeredMessage> messageTopic,
    TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    DeleteCommandRequest delRequest = await req.Content.ReadAsAsync<DeleteCommandRequest>();

    log.Info($"Delete request received: {delRequest.SagaId} {delRequest.Action} {delRequest.RequestId}");

    var brokeredMessage = new BrokeredMessage(delRequest);

    await messageTopic.AddAsync(brokeredMessage);

    return req.CreateResponse(HttpStatusCode.OK, JsonConvert.SerializeObject(delRequest));
}

Но с использованием приведенного выше кода функция триггера http не отправляет сообщение через посредника в тему. Кто-нибудь может сообщить мне, что я здесь делаю не так, пожалуйста?

Спасибо


person Mukil Deepthi    schedule 03.05.2018    source источник
comment
взгляните на docs.microsoft .com / ru-ru / azure / azure-functions /   -  person Roman Kiss    schedule 03.05.2018
comment
Можете ли вы поделиться своим файлом function.json? Я подозреваю, что ваша строка подключения установлена ​​неправильно?   -  person Thomas    schedule 05.05.2018
comment
Не могли бы вы подробнее рассказать о функции триггера http, которая не отправляет сообщение через посредника в тему? Вы столкнулись с ошибкой или сообщения не отображаются внутри ServiceBus?   -  person kamil-mrzyglod    schedule 07.05.2018


Ответы (1)


Ниже приводится расширенный шаблон httptrigger для привязок вывода ServiceBus:

#r "Newtonsoft.Json"
#r "Microsoft.ServiceBus"
#r "System.Runtime.Serialization"

using System.Text;
using System.Runtime.Serialization;
using System.Net;
using Newtonsoft.Json;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;


public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, IAsyncCollector<BrokeredMessage> collector, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    // parse query parameter
    string name = req.GetQueryNameValuePairs()
    .FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
    .Value;

    if (name == null)
    {
        // Get request body
        dynamic data = await req.Content.ReadAsAsync<object>();
        name = data?.name;
    }

    // brokered message
    var payload = JsonConvert.SerializeObject(new { id = 1234, name = "abcd" });
    var bm = new BrokeredMessage(new MemoryStream(Encoding.UTF8.GetBytes(payload)), true) { ContentType = "application/json", Label = "Hello", MessageId = "1234567890" };
    await collector.AddAsync(bm);

    return name == null
        ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
        : req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
}

и файл function.json:

    {
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "serviceBus",
      "connection": "{yourconnection}",
      "name": "collector",
      "topicName": "{yourtopic}",
      "accessRights": "Manage",
      "direction": "out"
    }
  ],
  "disabled": false
}
person Roman Kiss    schedule 03.05.2018
comment
Спасибо. Но в коде нет места, где атрибут служебной шины упоминается в качестве вывода. как получилось, что это добавлено в function.json? Я пытаюсь создать это в VS2017. - person Mukil Deepthi; 15.05.2018