У меня есть приложение-функция Azure с триггером HTTP, которое получает автоматическое сообщение HTTP, записывает сообщение в хранилище BLOB-объектов и затем возвращает простой ответ конверта XML SOAP, который подтверждает получение сообщения HTTP. Вот код Закомментированный код - это другие способы, которыми я пытался заставить это работать, но который также был неудачным.
Когда я тестирую этот код локально, он работает правильно и возвращает ответ XML. Однако когда я публикую его в Azure, он просто возвращает «200» в теле ответа. В предыдущей итерации этой функции я возвращал строку «200» в теле, поэтому мне интересно, не могу ли я просто правильно опубликовать в Azure. Я проверил журналы активности Azure и вижу обновления моего приложения, которые соответствуют моим попыткам публикации.
Я использую .Net 4.6.1 и .Net SDK 1.0.11
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Blob;
namespace MyFunctionsApp
{
public static class MyNotifications
{
[FunctionName("MyHttpTrigger")]
public static async Task<HttpResponseMessage> MyHttpTrigger(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req,
[Blob("my-notifications", Connection = "StorageConnectionString")] CloudBlobContainer container,
TraceWriter log)
{
log.Info("The MyHttpTrigger function was triggered.");
var blobName = $"{DateTime.UtcNow.ToString("o")}-{CreateGuid()}";
var blockBlobReference = container.GetBlockBlobReference(blobName);
using (Stream stream = await req.Content.ReadAsStreamAsync())
{
await blockBlobReference.UploadFromStreamAsync(stream);
}
// Tried using a StringBuilder to assemble my XML response in case there was an error with my formatting (double quotes etc...).
StringBuilder xmlBuilder = new StringBuilder();
xmlBuilder.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
xmlBuilder.Append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">");
xmlBuilder.Append("<soapenv:Body>");
xmlBuilder.Append("<ReceiveNotificationResponse xmlns=\"http://apps.myapp.net/services/subscribers\" />");
xmlBuilder.Append("</soapenv:Body>");
xmlBuilder.Append("</soapenv:Envelope>");
// Tried writing the XML response inline.
//var xmlResponse = @"<?xml version=""1.0"" encoding=""utf-8""?>
// <soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"">
// <soapenv:Body>
// <ReceiveNotificationResponse xmlns=""http://apps.MyAppName.net/services/subscribers"" />
// </soapenv:Body>
// </soapenv:Envelope>
// ";
var response = new HttpResponseMessage
{
//StatusCode = HttpStatusCode.OK,
Content = new StringContent(xmlBuilder.ToString(), Encoding.UTF8, "text/xml")
// Tried reading the XML response from a .xml file
// Content = new StringContent(File.ReadAllText("../../../../MyFunctionsApp/XmlResponseMessage.xml")),
};
// Set additional headers
//response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml");
//response.Content.Headers.ContentType.CharSet = "utf-8";
//response.Content.Headers.Add("Content-Type", "text/xml");
return response;
}
private static Guid CreateGuid()
{
Guid guid = Guid.NewGuid();
return guid;
}
}
}
Неверный ответ от Azure
Ожидаемый ответ, полученный при локальном тестировании
P.S. В этом коде есть некоторые несоответствия с именами, поскольку я удалил некоторую идентифицирующую информацию. Пожалуйста, игнорируйте это.
РЕДАКТИРОВАТЬ: Я решил эту проблему, но я все еще не уверен, как ее преодолеть. Как и ожидалось, проблема заключалась в том, что код, который я публиковал, не переписывал код в Azure. Я удалил свое приложение и переиздал, и оно начало работать с кодом ниже. Я бы назвал это ответом, однако я не уверен, как решить эту проблему, не прибегая к удалению моего приложения каждый раз, когда мне нужно внести изменения, что явно не рекомендуется.