Функции Azure не будут перезаписаны новым контентом, опубликованным из VS? - PullRequest
0 голосов
/ 22 января 2019

У меня есть приложение-функция 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 Incorrect response Ожидаемый ответ, полученный при локальном тестировании Expected response

P.S. В этом коде есть некоторые несоответствия с именами, поскольку я удалил некоторую идентифицирующую информацию. Пожалуйста, игнорируйте это.

РЕДАКТИРОВАТЬ: Я решил эту проблему, но я все еще не уверен, как ее преодолеть. Как и ожидалось, проблема заключалась в том, что код, который я публиковал, не переписывал код в Azure. Я удалил свое приложение и переиздал, и оно начало работать с кодом ниже. Я бы назвал это ответом, однако я не уверен, как решить эту проблему, не прибегая к удалению моего приложения каждый раз, когда мне нужно внести изменения, что явно не рекомендуется.

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Добавьте тип носителя, как показано ниже,

return new OkObjectResult(xmlDoc) { ContentTypes = new Microsoft.AspNetCore.Mvc.Formatters.MediaTypeCollection { @"application/xml" } };
0 голосов
/ 24 января 2019

Поскольку вы определили, что проблема заключается в том, что файлы не перезаписываются после публикации, попробуйте установить удаление существующих файлов в профиле публикации.

На панели публикации нажмите Manage Profile settings..., а затем отметьте Remove additional files at destination.

enter image description here

Обратите внимание, что это потенциальное решение, поскольку я не сталкивался с подобными проблемами, и даже без Remove additional files at destination образец проекта, который вы предоставляете, может быть обновлен (т. Е. С 200 до XML-контента), как и ожидалось, на моей стороне.

Кстати, обновите Microsoft.NET.Sdk.Functions до последней (прямо сейчас 1.0.24), если мы столкнемся с какой-либо проблемой из-за устаревшего SDK.

0 голосов
/ 22 января 2019

Не могли бы вы вместо этого вернуть ContentResult?например,

StringBuilder xmlBuilder = new StringBuilder();

// ... build xml....

return new ContentResult
{
    Content = xmlBuilder.ToString(),
    ContentType = @"application/xml",
    StatusCode = StatusCodes.Status200OK
};
...