komakommander Ответов: 1

Функции Azure с триггером служебной шины не работают с REST API


Всем привет,

я бьюсь головой о следующую задачу:

У меня есть функция AzureFunction, которая использует триггер ServiceBus, например:

{
  "bindings": [
    {
      "name": "myQueueItem",
      "type": "serviceBusTrigger",
      "direction": "in",
      "connection": "MyConnection",
      "accessRights": "Listen",
      "topicName": "MyTopic",
      "subscriptionName": "MySubscription"
    }
  ],
  "disabled": false
}


public static void Run(byte[] myQueueItem, TraceWriter log)
{
    log.Info($"Incoming queue item was: {myQueueItem}");
}


На стороне отправителя я использую следующий код:

private static void SendMessagesToServiceBus()
		{
			string senderConnectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionStringSender");
			TopicClient senderClient = TopicClient.CreateFromConnectionString(senderConnectionString);

			var content = Encoding.UTF8.GetBytes("Some string");
			BrokeredMessage message = new BrokeredMessage(content);
			message.ContentType = "text/plain";
			senderClient.Send(message);


			System.Console.WriteLine("Test message");
		}


Это действует как заклинание. Теперь начинаются неприятности. У меня есть новый клиент, который не имеет никакого отношения к Aszure.Сборка сервисной шины. Поэтому я не могу использовать BrokeredMessage для отправки сообщения в служебную шину. Вместо этого я попытался использовать REST API служебной Шины и пришел к следующему выводу:

private static void SendCheckpointServiceBusApi()
{
   var sas = createToken("sb://myendpoint.servicebus.windows.net/", "TopicSender", "MySecretKey");
   client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", sas);
   String message = "Some string";
   ByteArrayContent postContent = new ByteArrayContent(Encoding.UTF8.GetBytes(message));
   postContent.Headers.Add("ContentType", "text/plain");
   var response = client.PostAsync("https://myendpoint.servicebus.windows.net/topic" + "/messages" + "?timeout=60", postContent);
   response.Wait();
   response.Result.EnsureSuccessStatusCode();

}


Всякий раз, когда я отправляю это на служебную шину, я получаю следующее исключение

Exception while executing function: Functions.CheckpointToDatabase. Microsoft.Azure.WebJobs.Host: Exception binding parameter 'myQueueItem'. System.Runtime.Serialization: There was an error deserializing the object of type System.Byte[]. The input source is not correctly formatted. System.Runtime.Serialization: The input source is not correctly formatted.


Я уже узнал, что BrokeredMessage интенсивно использует сериализацию. Это должно быть отключено путем добавления contenttype text/plain.

Любая помощь очень ценится.

Что я уже пробовал:

Я уже пробовал различные комбинации ContentType (text/plain, application/xml, application/json) и типов параметров (string, byte[] и stream). Все работает когда сайт отправитель имеет доступ к BrokeredMessage. Используя rest и обычный контент UTF8, функция azure не может десериализоваться.

1 Ответов

Рейтинг:
2

Gurdeep

Ваша проблема явно заключается в разнице между этими линиями:

var content = Encoding.UTF8.GetBytes("Some string");

ByteArrayContent postContent = new ByteArrayContent(Encoding.UTF8.GetBytes(message));

Зачем использовать ByteArrayContent?