尝试访问Azure Function

时间:2018-07-25 08:11:34

标签: c# .net visual-studio azure azure-functions

我在Azure上有一个匿名函数,已使用Microsoft.NET.Sdk.Functions(1.0.13)成功部署了(.netstandard 2.0),但是由于某种原因,它突然停止工作,当我调用它时,响应为:

<ApiErrorModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Microsoft.Azure.WebJobs.Script.WebHost.Models">
<Arguments xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" i:nil="true"/>
<ErrorCode>0</ErrorCode>
<ErrorDetails i:nil="true"/>
<Id>91fab400-3447-4913-878f-715d9d4ab46b</Id>
<Message>
An error has occurred. For more information, please check the logs for error ID 91fab400-3447-4913-878f-715d9d4ab46b
</Message>
<RequestId>0fb00298-733d-4d88-9e73-c328d024e1bb</RequestId>
<StatusCode>InternalServerError</StatusCode>
</ApiErrorModel>

如何解决?

编辑:当我在本地启动AF环境并运行该功能时,它可以按预期工作,没有任何问题,尽管我在控制台中看到的是红色消息:

enter image description here

并搜索它,偶然发现了这个GitHub帖子: https://github.com/Azure/azure-functions-host/issues/2765

我注意到这部分的地方:

  

@ m-demydiuk注意到azure函数可以在控制台中解决此错误。因此,此红色错误不会破坏本地计算机上的功能。但是我担心它可能会在其他环境中引起任何问题。

它困扰着我。可能是问题吗?

我使用的lib版本与我的目标框架不匹配,但再次在本地运行良好,并且在Azure上也可以正常运行

enter image description here

我的主机版本为“ Version = 2.0.11651.0”

这是整个功能:

public static class Function1
    {
        [FunctionName("HTML2IMG")]
        public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequest req, TraceWriter log)
        {
            string url = req.Query["url"];

            byte[] EncodedData = Convert.FromBase64String(url);
            string DecodedURL = Encoding.UTF8.GetString(EncodedData);

            string requestBody = new StreamReader(req.Body).ReadToEnd();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            DecodedURL = DecodedURL ?? data?.name;
            var api = new HtmlToPdfOrImage.Api("9123314e-219c-342d-a763-0a3dsdf8ad21", "vmZ31vyg");

            var ApiResult = api.Convert(new Uri($"{DecodedURL}"), new HtmlToPdfOrImage.GenerateSettings() { OutputType = HtmlToPdfOrImage.OutputType.Image });

            string BlobName = Guid.NewGuid().ToString("n");
            string ImageURL = await CreateBlob($"{BlobName}.png", (byte[])ApiResult.model, log);
            var Result = new HttpResponseMessage(HttpStatusCode.OK);
            var oJSON = new { url = ImageURL, hash = BlobName };
            var jsonToReturn = JsonConvert.SerializeObject(oJSON);

            Result.Content = new StringContent(jsonToReturn);
            Result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            return Result;
        }

        private async static Task<string> CreateBlob(string name, byte[] data, TraceWriter log)
        {
            string accessKey = "xxx";
            string accountName = "xxx";
            string connectionString = "DefaultEndpointsProtocol=https;AccountName=" + accountName + ";AccountKey=" + accessKey + ";EndpointSuffix=core.windows.net";
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
            CloudBlobClient client = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = client.GetContainerReference("images");

            await container.CreateIfNotExistsAsync();

            BlobContainerPermissions permissions = await container.GetPermissionsAsync();
            permissions.PublicAccess = BlobContainerPublicAccessType.Container;
            await container.SetPermissionsAsync(permissions);

            CloudBlockBlob blob = container.GetBlockBlobReference(name);
            blob.Properties.ContentType = "image/png";

            using (Stream stream = new MemoryStream(data))
            {
                await blob.UploadFromStreamAsync(stream);
            }

            return blob.Uri.AbsoluteUri;
        }

双重编辑: 我在VS中创建了空的V2 .net核心AF并立即发布->我遇到了同样的错误...我什至将Microsoft.NET.Sdk.Function更新为最新的1.0.14,而不是1.0.13,仍然得到同样的错误。显然,Azure或Visual Studio(15.7.5)中的某些内容已损坏?!?!

1 个答案:

答案 0 :(得分:2)

解决方案

在Azure门户上,转到“功能”应用程序设置,检查运行时版本。它可能是Runtime version: 1.0.11913.0 (~1)在您身边。这就是问题。在应用程序设置中将FUNCTIONS_EXTENSION_VERSION更改为beta,您的代码应可在Azure上运行。

说明

您将创建一个v2函数,因为您的本地主机版本为2.0.11651.0。因此,函数运行时还应该在线处于beta 2.x(最新版本为2.0.11933.0)。

当您以前从VS发布功能时,您可能会看到此提示

enter image description here

您可能选择了No,以便得到此错误。

请注意,如果像VSTS或Git这样通过CI / CD发布,则此类通知不可用。因此,我们需要确保正确配置了这些配置。

建议

如您所见,本地主机版本为2.0.11651,低于Azure上的2.0.11933。我确实建议您将Azure Functions and Web Jobs Tools(在VS菜单上,工具->扩展和更新)更新为最新版本(15.0.40617.0),以使VS消耗最新的函数运行时。

对于您的代码,我建议您创建images容器并在门户上手动设置其公共访问级别,因为此过程仅需要执行一次。

然后我们可以使用blob output bindings

  1. 使用存储连接字符串将StorageConnection添加到“应用程序设置”中。如果您的images容器位于功能应用程序使用的存储帐户中(“应用程序”设置中的AzureWebJobsStorge),请忽略此步骤并删除下面的Connection参数,因为绑定默认情况下使用该存储帐户。

  2. 添加blob输出绑定

    public static async Task<HttpResponseMessage> Run(...,TraceWriter log,
            [Blob("images", FileAccess.Read, Connection = "StorageConnection")] CloudBlobContainer container)
    
  3. 更改CreateBlob方法

    private async static Task<string> CreateBlob(string name, byte[] data, TraceWriter log, CloudBlobContainer container)
    {
        CloudBlockBlob blob = container.GetBlockBlobReference(name);
        blob.Properties.ContentType = "image/png";
    
        using (Stream stream = new MemoryStream(data))
        {
            await blob.UploadFromStreamAsync(stream);
        }
    
        return blob.Uri.AbsoluteUri;
    }