当通过Docker和Visual Studio发布到Azure时,Azure函数HTTP请求404
我正在尝试了解更多有关Azure功能2.0和Docker容器的信息,以便发布到我的Azure实例。我遵循下面的教程,唯一的区别是我使用VisualStudio2019与docker一起发布到azure中的容器注册表中 这一切都正常工作,我能够启动我的容器并访问该站点。但是,在本例中,您可以访问/api/function1并获得响应。这在我的本地主机上运行,但在实时站点上返回404。似乎/api/function1在发布后无法访问 当访问IP时,应用程序本身会返回此信息,因此我知道它正在工作。我是否需要在Azure中执行其他操作来公开我的API 我的容器日志只显示了这一点当通过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时,应用程序本身会返回此信息,因此我知道它正在工作。我是
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