簡體   English   中英

嘗試訪問Azure功能時出錯

[英]Error when trying to access Azure Function

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

DOUBLE EDIT:我在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以便您收到錯誤消息。

請注意,如果我們通過CI / CD(如VSTS或Git)發布,則此類通知不可用。 所以我們需要確保正確設置這些配置。

建議

如您所見,本地主機版本為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; } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM