Не удается найти Index.cshtml NET Core App 3.0 - PullRequest
0 голосов
/ 06 июня 2019

Да, есть множество вопросов и ответов по этому вопросу, но я не могу найти тот, который подходит мне - я просто не вижу, что мне не хватает или что-то не так.

Настольное приложение для Windows, которое просто должно обслуживать пару страниц Razor (вместе с SignalR). Если я перехожу к https://localhost:5000 с V1 HomeController (см. Ниже), то браузер правильно отображает строку, поэтому я знаю, что перехожу к правильному URI. Но если я изменю контроллер, чтобы вместо этого вернуть представление, я получу следующее:

An unhandled exception occurred while processing the request.
InvalidOperationException: The view 'Index' was not found. The following locations were searched:
/Views/Home/Index.cshtml
/Views/Shared/Index.cshtml
/Pages/Shared/Index.cshtml

Microsoft.AspNetCore.Mvc.ViewEngines.ViewEngineResult.EnsureSuccessful(IEnumerable<string> originalLocations)

При запуске последнего в окне вывода отображается:

Microsoft.Hosting.Lifetime: Information: Now listening on: http://localhost:5000
Microsoft.Hosting.Lifetime: Information: Application started. Press Ctrl+C to shut down.
Microsoft.Hosting.Lifetime: Information: Hosting environment: Development
Microsoft.Hosting.Lifetime: Information: Content root path: C:\Users\geoff\source\repos\xxx\yyy\bin\Debug\netcoreapp3.0

Index.cshtml (в этом корпусе) находится по адресу (также в wwwroot \ Views и т. Д.):

C:\Users\geoff\source\repos\xxx\yyy\bin\Debug\netcoreapp3.0\Views\Home\Index.cshtml

Index.cshtml имеет значение BuildAction: Content и CopyToOutput: CopyIfNewer, и да, файл присутствует при запуске с правильным корпусом.

Я читал кое-что о добавлении движка вида, но, насколько я понимаю, Razor там есть. Я думаю это единственное, что я не пробовал. Я также пробовал собственные маршруты вместо стандартных, но безуспешно.

Помощь с благодарностью.

Часть .csproj:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UseWPF>true</UseWPF>
    <PreserveCompilationContext />
    <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
    <MvcRazorExcludeViewFilesFromPublish>false</MvcRazorExcludeViewFilesFromPublish>
    <MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
  </PropertyGroup>

  <ItemGroup>
    <None Remove="Views\Home\Index.cshtml" />
    <None Remove="wwwroot\Views\Home\Index.cshtml" />
  </ItemGroup>

  <ItemGroup>
    <Content Include="Views\Home\Index.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <Content Include="wwwroot\Views\Home\Index.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="1.1.0">
      <PrivateAssets>All</PrivateAssets>
    </PackageReference>
  </ItemGroup>
  <ItemGroup>
    <None Update="wwwroot\**\*;**.cshtml">
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </None>
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="AvalonEdit" Version="5.0.4" />
    <PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.7" />
    <PackageReference Include="Microsoft.AspNetCore.App" Version="3.0.0-preview3-19153-02" />
    <PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
    <PackageReference Include="Microsoft.AspNetCore.Http.Connections" Version="1.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="3.0.0-preview5-19227-01" />
    <PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.SignalR.Core" Version="1.1.0" />
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" />
  </ItemGroup>

</Project>

App.xaml.cs:

public partial class App : Application
{
    private IHost _host;

    protected override void OnStartup(StartupEventArgs e)
    {
        string path = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
        _host = Host.CreateDefaultBuilder(e.Args)
            .UseContentRoot(path)
            .ConfigureWebHostDefaults(webHostBuilder => webHostBuilder.UseStartup<StartUp>())
            .ConfigureServices(services =>
            {
                services.AddTransient<MainWindow>();

                services.AddCors(o => o.AddPolicy("CorsPolicy", builder =>
                {
                    builder.AllowAnyOrigin()
                           .AllowAnyMethod()
                           .AllowAnyHeader();
                }));

                services.AddMvc();

                services.AddSignalR().AddHubOptions<SsoHub>(options =>
                {
                    options.EnableDetailedErrors = true;
                });

                services.AddSingleton<ISsoHubHelper, SsoHubHelper>();

            })
            .Build();

        _host.Start();
    }

    protected override void OnExit(ExitEventArgs e) => _host.Dispose();
}

Часть файла startup.cs:

public class StartUp
{
    public static IServiceProvider ServiceProvider { get; private set; }
    public static T GetService<T>() { return ServiceProvider.GetRequiredService<T>(); }

    public static ISsoHubHelper HubContext;

    public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        app.UseCors(builder =>
        {
            builder.AllowAnyOrigin()
                   .AllowAnyMethod()
                   .AllowAnyHeader();
        });

        app.UseStaticFiles();
        app.UseStatusCodePages();
        app.UseDeveloperExceptionPage();
        app.UseMvcWithDefaultRoute();

        app.UseSignalR((configure) =>
        {
            var desiredTransports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;

            configure.MapHub<SsoHub>("/ssohub", (options) =>
            {
                options.Transports = desiredTransports;
            });
        });

        ServiceProvider = serviceProvider;
        HubContext = GetService<ISsoHubHelper>();
    }
}

HomeController.cs (V1 - работает):

public class HomeController : Controller
{
    public string Index()
    {
        return "Hello, world!";
    }

}

HomeController.cs (V2 - index.cshtml не найден):

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

}

1 Ответ

0 голосов
/ 08 июня 2019

Нашел это. Вздох. С помощью довольно не связанных между собой вопросов и ответов я использовал монитор ресурсов, чтобы определить, что даже попытки открытия файлов не были предприняты. Это заставило меня поверить, что страницы должны были быть скомпилированы, и это привело к этому сообщению , которое указывало на серьезные изменения. Цитата из одного из ответов (кредит: Дмитрий Павлов):

  1. Ссылка Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation (предварительная версия)
  2. Звоните services.AddMvc().AddRazorRuntimeCompilation()

И, наконец, это работает. Файл cshtml был там все время, как и должно было быть, и знал, что это так, но он просто не компилировался.

...