我在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_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输出绑定。
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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句