我在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)中的某些内容已损坏?!?!
答案 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发布功能时,您可能会看到此提示
您可能选择了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。
使用存储连接字符串将StorageConnection
添加到“应用程序设置”中。如果您的images
容器位于功能应用程序使用的存储帐户中(“应用程序”设置中的AzureWebJobsStorge
),请忽略此步骤并删除下面的Connection
参数,因为绑定默认情况下使用该存储帐户。
添加blob输出绑定
public static async Task<HttpResponseMessage> Run(...,TraceWriter log,
[Blob("images", FileAccess.Read, Connection = "StorageConnection")] CloudBlobContainer container)
更改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;
}