尝试访问Azure Function时出错

nmrlqa4

我在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环境并运行该功能时,它可以按预期工作,没有任何问题,尽管我在控制台中看到的是红色消息:

在此处输入图片说明

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

我注意到这部分的地方:

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

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

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

在此处输入图片说明

我的主机版本是“ 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)中的某些内容损坏了!!?!

刘杰

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

说明

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

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

在此处输入图片说明

您可能选择了,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输出绑定

  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;
    }
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章