Docker容器中运行.NET Framework Web API出现403禁止访问问题求助
ASP.NET Framework API容器访问返回403禁止错误
参照官方ASP.NET容器示例构建REST API容器,操作步骤简单,但运行后访问极简心跳控制器时收到403 - Forbidden: Access is denied.响应,未配置任何授权,使用IIS 10。
心跳控制器代码
public class HeartBeatController : ApiController { // GET: api/HearBeat/5 public HttpResponseMessage Get() { return new HttpResponseMessage(HttpStatusCode.OK); } }
已尝试操作
- 修改目录
ACL权限 - 确保应用程序目录位于IIS目录内
容器内目录结构
PS C:\inetpub\wwwroot> ls Directory: C:\inetpub\wwwroot Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 11/15/2022 10:16 AM Service2
所用Dockerfile
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2019 AS build WORKDIR /app # copy csproj and restore as distinct layers COPY *.sln . COPY /Service1/*.csproj ./Service1/ COPY /Service1/*.config ./Service1/ COPY /Service2/*.csproj ./Service2/ COPY /Service2/*.config ./Service2/ RUN nuget restore COPY /Service1/. ./Service1/ COPY /Service2/. ./Service2/ # copy everything else and build app RUN msbuild /p:Configuration=Release /p:ProcessorArchitecture=x86 -r:False FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8 AS runtime WORKDIR /inetpub/wwwroot EXPOSE 80 COPY --from=build /app/Service2/bin/. ./Service2/
解决方案
1. 配置IIS子目录为应用程序
容器内IIS默认站点根目录是C:\inetpub\wwwroot,你的应用文件在Service2子目录下,需将该目录注册为IIS应用程序,否则无法正确处理API路由。在Dockerfile的runtime阶段添加以下命令:
RUN powershell -Command "Import-Module WebAdministration; New-WebApplication -Name 'Service2' -Site 'Default Web Site' -PhysicalPath 'C:\inetpub\wwwroot\Service2' -ApplicationPool 'DefaultAppPool'"
2. 验证API路由配置
确保WebApiConfig.cs中有正确的路由规则:
public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }
同时检查控制器是否标注了正确的路由前缀,比如[RoutePrefix("api/HeartBeat")],避免路径匹配失败。
3. 确保应用程序池权限
给DefaultAppPool授予Service2目录的读取权限,在Dockerfile中添加:
RUN icacls "C:\inetpub\wwwroot\Service2" /grant "IIS APPPOOL\DefaultAppPool:(OI)(CI)RX"
4. 确认构建产物完整性
检查msbuild生成的Service2/bin目录是否包含web.config、所有程序集及依赖文件,缺失文件会导致IIS无法加载应用。
内容的提问来源于stack exchange,提问作者Nick__Dudas
相关产品推荐
相关产品推荐

