Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 500内部服务器错误Docker托管的ASP.Net MVC web应用程序(已解决)_Asp.net Mvc_Docker_Iis - Fatal编程技术网

Asp.net mvc 500内部服务器错误Docker托管的ASP.Net MVC web应用程序(已解决)

Asp.net mvc 500内部服务器错误Docker托管的ASP.Net MVC web应用程序(已解决),asp.net-mvc,docker,iis,Asp.net Mvc,Docker,Iis,我们有一个ASP.NETMVC应用程序,当我们从VisualStudio以调试模式在本地运行时,它运行良好。 我们有4个类库项目和一个web api项目。以下是我的docker文件: FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build WORKDIR /app # copy csproj and restore as distinct layers COPY *.sln . COPY xxxxx/*.csproj ./xxxxx/

我们有一个ASP.NETMVC应用程序,当我们从VisualStudio以调试模式在本地运行时,它运行良好。 我们有4个类库项目和一个web api项目。以下是我的docker文件:

FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.sln .
COPY xxxxx/*.csproj ./xxxxx/
COPY yyyyyy/*.csproj ./yyyyy/
# copy everything else and build app
COPY xxxxx/ ./xxxxx/
COPY yyyyy/ ./yyyyy/
RUN nuget restore

WORKDIR /app/GetThree
RUN msbuild /p:Configuration=Release

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8 AS runtime
WORKDIR /inetpub/wwwroot
COPY --from=build /app/xxxxx/. ./
一旦我构建了docker文件,一切都会正确编译,构建也会成功(所有Nuget包都会被还原),我也能够创建容器。但不幸的是,每当我尝试浏览我的web应用时(我得到了容器的IP地址,因为这是windows base),但不幸的是,我立即得到HTTP 500内部服务器错误。我已经确保为详细的错误消息设置了HTTPERROR部分

当我导航到ip地址时,我得到了这个500错误,不幸的是,日志(应用程序或系统)中没有多少可用信息,这将帮助我了解问题可能是什么。有什么帮助吗

以下是我用于构建和运行容器的命令:

docker build -f .\GetThree\Dockerfile -t threecms/cmsdocker:1.0 
docker run --name threecms --rm -it -p 8100:80 threecms/cmsdocker:1.0
要浏览该站点,我获取IP地址(使用docker exec threecms ipconfig),并使用以下方式浏览:http://ipadress:8100

更新1:-

我使用下面的dockerfile从上面的图像创建了一个以上的图像(urlrewrite是urlrewrite模块安装脚本)

URL重写PS1脚本:

New-Item c:/msi -ItemType Directory
Invoke-WebRequest 'http://download.microsoft.com/download/C/F/F/CFF3A0B8-99D4-41A2-AE1A-496C08BEB904/WebPlatformInstaller_amd64_en-US.msi' -OutFile c:/msi/WebPlatformInstaller_amd64_en-US.msi
Start-Process 'c:/msi/WebPlatformInstaller_amd64_en-US.msi' '/qn' -PassThru | Wait-Process
cd 'C:/Program Files/Microsoft/Web Platform Installer'; .\WebpiCmd.exe /Install /Products:'UrlRewrite2,ARRv3_0' /AcceptEULA /Log:c:/msi/WebpiCmd.log
然后,我使用以下命令运行容器:-

docker run --name threecms2 -d cmswindfeature/cmswinfeature:3.0
现在,每当我从浏览器访问我的应用程序时,它都会给我实际的错误消息,即:

Access to the path 'C:\inetpub\wwwroot\App_Data\TEMP\PluginCache\umbraco-plugins.373F7AAE388A.hash' is denied.
更新:-2已解决

因此,为了解决上述错误,我运行了以下Powershell脚本(以添加所需的权限),现在我可以访问我的站点及其工作区:-

$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("IIS_IUSRS", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl = Get-ACL "C:\inetpub\wwwroot"
$acl.AddAccessRule($accessRule)
Set-ACL -Path "C:\inetpub\wwwroot" -ACLObject $acl

您需要从网站的应用程序池中找出它运行时使用的标识(默认情况下,这是应用程序池标识),并授予正确的权限。通常是IIS_IUSRS,您可以尝试以下步骤来解决此问题:

右键单击文件夹->转到安全选项卡->单击编辑->单击添加->单击添加 ->立即查找->授予IIS\u IUSRS(完全控制)权限->单击确定->单击确定-> 单击允许中的完全控制->单击确定


注意:如果上述操作不起作用,则尝试向网络、网络服务用户授予相同的权限

您需要从网站的应用程序池中找出它运行的身份(默认情况下,这是应用程序池身份),并授予正确的权限。通常是IIS_IUSRS,您可以尝试以下步骤来解决此问题:

右键单击文件夹->转到安全选项卡->单击编辑->单击添加->单击添加 ->立即查找->授予IIS\u IUSRS(完全控制)权限->单击确定->单击确定-> 单击允许中的完全控制->单击确定


注意:如果上述操作不起作用,则尝试向网络、网络服务用户授予相同的权限

添加用于运行映像和检查容器日志的命令。@Max添加了用于生成和运行映像的两个命令,此外,每当我运行docker容器日志containerID命令时,我得到的结果是:服务“w3svc”已停止服务“w3svc”已启动添加用于运行映像和检查容器日志的命令。@Max添加了用于生成和运行映像的两个命令,此外,每当我运行docker container logs containerID命令时,我得到的结果是:服务“w3svc”已停止服务“w3svc”已启动感谢您的回复@samwu,但我已解决了此问题,并在上一篇文章中发布了答案。感谢您的回复@samwu,但我已解决此问题,并在我的文章中发布了答案以前的职位。
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("IIS_IUSRS", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl = Get-ACL "C:\inetpub\wwwroot"
$acl.AddAccessRule($accessRule)
Set-ACL -Path "C:\inetpub\wwwroot" -ACLObject $acl