仅在 IIS 中使用 ASP.NET Core 时未找到部分视图异常

问题描述 投票:0回答:2

迁移到 .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>
asp.net-core iis partial-views
2个回答
0
投票

一位同事找到了问题的解决方案,线索在https://weblog.west-wind.com/posts/2019/Sep/30/Serving-ASPNET-Core-Web-Content-from-External-文件夹

需要进行 2 处更改:

  1. 添加包:Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  2. 称为扩展以支持控制器/视图上的运行时复杂性:
    services.AddControllersWithViews().AddRazorRuntimeCompilation(opt =>
    {
        opt.FileProviders.Add(
            new PhysicalFileProvider(System.IO.Path.Combine(Environment.ContentRootPath, ""))
        );
    })

如果要更改支持动态编译的路径,只需将“”更改为允许动态编译的路径即可。


0
投票

打开项目页面(ProjectName.csproj)并检查以下行是否存在

 <Content Remove="Views\**\**.cshtml" />

如果有,请删除。并包括以下内容

 <None Include="Views\**\**.cshtml" />

注意:-请将 url 替换为您的部分页面 url。

© www.soinside.com 2019 - 2024. All rights reserved.