迁移到 .net 5 后,我们遇到了部分视图问题。主页将选择性地呈现自定义部分视图,以允许每个客户进行自定义。迁移后我们无法渲染这些部分视图。错误消息是:
InvalidOperationException: The partial view ~/Resources/Customer/Views/File.cshtml was not found. The following locations were searched: ~/Resources/Customer/Views/File.cshtml
我们知道路径是有效的,因为如果我们重命名页面呈现的文件(无需自定义)。如果我们在 Visual Studio 中调试,页面将按预期呈现,但在已部署的 IIS 服务器中它会失败。我们怀疑存在权限问题,但一直无法找到。到目前为止,我们还没有在谷歌搜索或SO中找到任何东西
这是我们处理自定义文件的片段:
// load file path from config
string url = configuration.OrderPageSetting["OrderInfoViewRenderFile"];
bool exists = false;
// determine the path
if (!string.IsNullOrWhiteSpace(url))
{
string _url = url;
if (_url.StartsWith("~/")) _url = _url.Substring(2);
else if (_url.StartsWith("/")) _url = _url.Substring(1);
exists = System.IO.File.Exists(System.IO.Path.Combine(Resource.SystemDirectory, _url));
}
// test for and render custom view
if (exists)
{
var data = new ViewDataDictionary<object>(new EmptyModelMetadataProvider(), new ModelStateDictionary());
data.Add("Order", order);
data.Add("Config", configuration);
await Html.RenderPartialAsync(url, data);
}
else
{
... default rendering ...
}
应用程序托管在具有专用应用程序池的虚拟目录中。如果站点级别没有 web.config,则会出现此问题。在同一服务器上,应用程序的先前 .net Framework 版本可以正常工作。
这是应用程序的 web.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\myapp.dll" stdoutLogEnabled="false" hostingModel="InProcess" stdoutLogFile=".\logs\stdout">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
</configuration>
一位同事找到了问题的解决方案,线索在https://weblog.west-wind.com/posts/2019/Sep/30/Serving-ASPNET-Core-Web-Content-from-External-文件夹
需要进行 2 处更改:
services.AddControllersWithViews().AddRazorRuntimeCompilation(opt =>
{
opt.FileProviders.Add(
new PhysicalFileProvider(System.IO.Path.Combine(Environment.ContentRootPath, ""))
);
})
如果要更改支持动态编译的路径,只需将“”更改为允许动态编译的路径即可。
打开项目页面(ProjectName.csproj)并检查以下行是否存在
<Content Remove="Views\**\**.cshtml" />
如果有,请删除。并包括以下内容
<None Include="Views\**\**.cshtml" />
注意:-请将 url 替换为您的部分页面 url。