gpt4 book ai didi

通过 Docker 和 Visual Studio 发布到 Azure 时,Azure 函数 HTTP 请求 404

转载 作者:行者123 更新时间:2023-12-03 02:42:57 26 4
gpt4 key购买 nike

我正在尝试了解有关 Azure Functions 2.0 和 Docker 容器的更多信息,以发布到我的 Azure 实例。我按照下面的教程进行操作,唯一的区别是我使用 Visual Studio 2019 将 docker 发布到 azure 中的容器注册表。

https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-your-first-function-visual-studio

这一切都工作正常,我能够启动我的容器并访问该站点。但是,在示例中,您可以访问/api/function1 并获得响应。这在我的本地主机上有效,但在实时站点上它返回 404。似乎/api/function1 在发布后无法访问。

应用程序本身在访问 IP 本身时返回此信息,因此我知道它正在工作。我是否需要在 Azure 中执行其他操作来公开我的 API?

Azure screenshot working default page

我的容器日志仅显示这一点。

Hosting environment: Production
Content root path: C:\
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.

我从这里获取了我的 dockerfile

https://github.com/Azure/azure-functions-docker/blob/master/host/2.0/nanoserver-1809/Dockerfile

# escape=`

# Installer image
FROM mcr.microsoft.com/windows/servercore:1809 AS installer-env

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

# Retrieve .NET Core SDK
ENV DOTNET_SDK_VERSION 2.2.402

RUN Invoke-WebRequest -OutFile dotnet.zip https://dotnetcli.blob.core.windows.net/dotnet/Sdk/$Env:DOTNET_SDK_VERSION/dotnet-sdk-$Env:DOTNET_SDK_VERSION-win-x64.zip; `
$dotnet_sha512 = '0fa3bf476b560c8fc70749df37a41580f5b97334b7a1f19d66e32096d055043f4d7ad2828f994306e0a24c62a3030358bcc4579d2d8d439d90f36fecfb2666f6'; `
if ((Get-FileHash dotnet.zip -Algorithm sha512).Hash -ne $dotnet_sha512) { `
Write-Host 'CHECKSUM VERIFICATION FAILED!'; `
exit 1; `
}; `
`
Expand-Archive dotnet.zip -DestinationPath dotnet; `
Remove-Item -Force dotnet.zip

ENV ASPNETCORE_URLS=http://+:80 `
DOTNET_RUNNING_IN_CONTAINER=true `
DOTNET_USE_POLLING_FILE_WATCHER=true `
NUGET_XMLDOC_MODE=skip `
PublishWithAspNetCoreTargetManifest=false `
HOST_COMMIT=69f124faed40d20d9d8e5b8d51f305d249b21512 `
BUILD_NUMBER=12858

RUN [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; `
Invoke-WebRequest -OutFile host.zip https://github.com/Azure/azure-functions-host/archive/$Env:HOST_COMMIT.zip; `
Expand-Archive host.zip .; `
cd azure-functions-host-$Env:HOST_COMMIT; `
/dotnet/dotnet publish /p:BuildNumber=$Env:BUILD_NUMBER /p:CommitHash=$Env:HOST_COMMIT src\WebJobs.Script.WebHost\WebJobs.Script.WebHost.csproj --output C:\runtime


# Runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2.7-nanoserver-1809

COPY --from=installer-env ["C:\\runtime", "C:\\runtime"]

ENV AzureWebJobsScriptRoot=C:\approot `
WEBSITE_HOSTNAME=localhost:80

CMD ["dotnet", "C:\\runtime\\Microsoft.Azure.WebJobs.Script.WebHost.dll"]

这是我的 Azure 函数的 function1 代码

public static class Function1
{
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");

string productid = req.Query["productid"];

string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
productid = productid ?? data?.product;

Product newProduct = new Product()
{
ProductNumber = 0,
ProductName = "Unknown",
ProductCost = 0
};
if (Convert.ToInt32(productid) ==1)
{
newProduct = new Product()
{
ProductCost = 100,
ProductName = "Lime Tree",
ProductNumber = 1
};
}
else if(Convert.ToInt32(productid) == 2)
{
newProduct = new Product()
{
ProductCost = 500,
ProductName = "Lemon Tree",
ProductNumber = 2
};
}
return productid != null
? (ActionResult)new JsonResult(newProduct)
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

这是我的容器与我的图像一起运行的照片。

Container image

我是新手,所以任何建议肯定会有帮助!

谢谢!

最佳答案

首先,我不知道您是否真的需要(或想要)在 Windows 容器上运行 Functions。如果你想在容器中运行,我可能会选择 Linux。为此,这是一个 Dockerfile 示例。它确实构建在 Microsoft 提供的基础镜像之上。因此您不必从头开始构建它。

我确信还有一个已经构建好的 Windows 基础镜像。如果您需要它,只需查看类似的存储库即可。

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

COPY . ./
RUN dotnet publish myfunction -c Release -o myfunction /out

FROM mcr.microsoft.com/azure-functions/dotnet:3.0 AS base
WORKDIR /app
EXPOSE 80

COPY --from=build-env /app/ao-backendfunctions/out .

ENV AzureWebJobsScriptRoot=/app
ENV AzureFunctionsJobHost__Logging__Console__IsEnabled=true

重要的部分是RUN dotnetpublish myfunction -c Release -o myfunction/out。将 myfunction 替换为实际函数的(文件夹)名称。

关于通过 Docker 和 Visual Studio 发布到 Azure 时,Azure 函数 HTTP 请求 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60214662/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com