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

当通过Docker和Visual Studio发布到Azure时,Azure函数HTTP请求404,azure,docker,azure-functions,http-status-code-404,httpresponse,Azure,Docker,Azure Functions,Http Status Code 404,Httpresponse,我正在尝试了解更多有关Azure功能2.0和Docker容器的信息,以便发布到我的Azure实例。我遵循下面的教程,唯一的区别是我使用VisualStudio2019与docker一起发布到azure中的容器注册表中 这一切都正常工作,我能够启动我的容器并访问该站点。但是,在本例中,您可以访问/api/function1并获得响应。这在我的本地主机上运行,但在实时站点上返回404。似乎/api/function1在发布后无法访问 当访问IP时,应用程序本身会返回此信息,因此我知道它正在工作。我是

我正在尝试了解更多有关Azure功能2.0和Docker容器的信息,以便发布到我的Azure实例。我遵循下面的教程,唯一的区别是我使用VisualStudio2019与docker一起发布到azure中的容器注册表中

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

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

我的容器日志只显示了这一点

Hosting environment: Production
Content root path: C:\
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.
我从这里抓起我的文件

以下是我的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");
        }
这是一张我的集装箱和我的照片

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


谢谢

首先,我不知道您是否真的需要或想要在Windows容器上运行函数。如果您想在容器中运行,我可能会选择Linux。为此,这是一个Dockerfile示例。它确实建立在微软提供的基本映像之上。所以你不必从头开始构建

我确信也有一个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

重要的部分是运行dotnetpublishmyfunction-c Release-o myfunction/out。用实际函数的文件夹名替换myfunction。

@silent的答案是正确的-Linux容器是Azure函数的最佳选择。我的环境没有为Linux容器正确设置,但一旦我得到了一个正确的环境,这就可以开箱即用了

这是我的另一个使用Linux容器的项目的最新DockerFile

请参阅,以了解Visual Studio如何使用此Dockerfile构建图像以加快调试。
我相信您需要将您的docker映像推送到Azure容器注册表或docker Hub。@Thiago嘿,Thiago,它现在就在上面!它作为一个实际的容器运行,只是没有/api/part。我编辑了我的问题以包含我正在运行的容器的照片。您将自定义DLL放在docker映像的哪个部分?我错过了吗?@沉默我不太确定,那可能是我错过的。我以为带docker构建的VisualStudio会自动做到这一点。我如何手动确保它进入那里?这是docker文件的改变吗?docker构建之外没有魔法发生;我明天会找一个例子。像这样的Azure函数在windows容器上不适用于我。我最初试图在Windows Server VM上实现这一点,但由于环境问题,当我切换到Linux容器时,该VM会崩溃。要避免所有这些,使用一台能够运行Linux容器的机器要容易得多。这有点像是把一个方形的钉子塞进一个圆形的洞里。我使用的是笔记本电脑而不是虚拟机,而且现成的VisualStudio发布工作正常。我建议在Azure函数中使用Linux容器。Visual studio不允许我为windows添加docker支持是有原因的。
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
FROM mcr.microsoft.com/azure-functions/dotnet:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
WORKDIR /src
COPY ["FunctionTestAppLinux/FunctionTestAppLinux.csproj", "FunctionTestAppLinux/"]
RUN dotnet restore "FunctionTestAppLinux/FunctionTestAppLinux.csproj"
COPY . .
WORKDIR "/src/FunctionTestAppLinux"
RUN dotnet build "FunctionTestAppLinux.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "FunctionTestAppLinux.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENV AzureWebJobsScriptRoot=/app