VS发布的新内容不会覆盖Azure函数吗?

时间:2019-01-22 17:42:57

标签: c# xml azure azure-functions

我有一个带有HTTP触发器的Azure Function应用程序,该触发器接收自动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 :(得分:1)

由于您已确定问题是文件在发布后似乎没有被覆盖,因此请尝试在发布配置文件中设置删除现有文件。

在发布面板上,单击Manage Profile settings...,然后选中Remove additional files at destination

enter image description here

请注意,这是一个潜在的解决方案,因为我还没有遇到类似的问题,即使没有Remove additional files at destination,您提供的示例项目也可以按照我的期望进行更新(即从200到xml内容)。

顺便说一句,如果我们由于SDK过期而遇到问题,请将Microsoft.NET.Sdk.Functions更新为最新版本(现在为1.0.24)。

答案 1 :(得分:0)

您可以尝试返回ContentResult吗?例如

StringBuilder xmlBuilder = new StringBuilder();

// ... build xml....

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

答案 2 :(得分:0)

添加如下所示的媒体类型,

return new OkObjectResult(xmlDoc) { ContentTypes = new Microsoft.AspNetCore.Mvc.Formatters.MediaTypeCollection { @"application/xml" } };