Да, есть множество вопросов и ответов по этому вопросу, но я не могу найти тот, который подходит мне - я просто не вижу, что мне не хватает или что-то не так.
Настольное приложение для 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();
}
}