Функции 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 не может десериализоваться.