O caminho da solicitação não corresponde a um tipo de arquivo compatível
Eu sou novo no .Net Core MVC. Estou tentando adicionar um controlador a um projeto existente, mas estou recebendo o erro
dbug: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[4]
The request path https://localhost:5001/api/admin/... does not match a supported file type
Isso me faz pensar que não está nem chegando ao aplicativo em si, mas está sendo bloqueado em algum tipo de middleware em algum lugar. Ou por que reclama do tipo de arquivo? Não há "tipo" envolvido aqui, é apenas uma string contendo uma URL.
No VSCode, adicionei o novo controlador na mesma pasta com os controladores existentes e a compilação funcionou bem. Ctrl-F5 o traz em meu navegador e posso executar as APIs antigas (pelo menos as que experimentei), mas não a nova; ele dá um 404 se eu usar uma URL para o novo controlador.
Isso também tem o Swagger instalado, e o Swagger mostra as APIs antigas, mas não a nova.
No Startup.cs tem
app.UseRouting();
e também
app.UseEndpoints(endpoints =>
{
endpoints.MapAreaControllerRoute(
name: "areas",
areaName: "areas",
pattern: "{area}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute("default",
"{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
Este é o .Net Core 3.1.302 e VSCode 1.48.0 no Windows 10.
Ao ler os tutoriais, pensei que tudo o que precisava fazer para adicionar um controlador era escrever o código (modelado de perto em um controlador existente e funcional) e construí-lo. Mas deve haver alguma etapa adicional para registrar ou registrar o novo controlador em algum lugar?
Este é o método de configuração correto? De Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider services)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
CreateUserRoles(services).Wait();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
#if Release
app.UseHttpsRedirection();
#endif
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetParent(Directory.GetCurrentDirectory()).FullName, "MobileApp.WebPortal", "wwwroot")),
ServeUnknownFileTypes = true
});
app.UseSession();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseHangfireDashboard("/jobs", new DashboardOptions
{
Authorization = new [] { new HangfireAuthorizationFilter() },
AppPath = "/"
});
#if RELEASE
//app.UseWebMarkupMin();
#endif
app.UseEndpoints(endpoints =>
{
//endpoints.MapControllers();
//endpoints.MapRazorPages();
endpoints.MapAreaControllerRoute(
name: "areas",
areaName: "areas",
pattern: "{area}/{controller=Home}/{action=Index}/{id?}");
//endpoints.MapAreaControllerRoute(
// name: "internaldefault",
// areaName: "Internal",
// pattern: "Internal/{controller=Patient}/{action}/{id?}");
//endpoints.MapAreaControllerRoute(
// name: "identity",
// areaName: "Identity",
// pattern: "Identity/{controller=Account}/{action=Login}/{id?}");
endpoints.MapControllerRoute("default",
"{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
//var config = new MapperConfigurationExpression();
//config.AddProfile(new MapperProfile());
//Mapper.Initialize(config);
var options = new MemoryCacheEntryOptions() { SlidingExpiration = TimeSpan.FromHours(2)};
QueryCacheManager.DefaultMemoryCacheEntryOptions = options;
}
Respostas
Bem, eu tenho uma resposta parcial para isso que não entendo inteiramente. Eu estava trabalhando no VSCode. Eu criei um novo arquivo para meu PatientListController e coloquei-o no lugar apropriado na hierarquia de arquivos, e recebi as mensagens de erro descritas acima (além do fato de que ele não apareceu no Swagger).
Mas se eu trabalho no Visual Studio (com o qual estou menos familiarizado), quando tento criar um novo arquivo, ele me pergunta especificamente o que estou criando e eu escolho Controlador na lista.
No VSCode, aparentemente ele não sabe o que é esse novo arquivo e então o compilador simplesmente o ignora. Portanto, o código compilado não tem vestígios do novo controlador.
No Visual Studio, o compilador sabe que adicionei um novo controlador e exatamente o mesmo código funciona bem e a nova API aparece no Swagger.
Portanto, deve haver alguma maneira no VSCode de sinalizar o que fazer com o novo arquivo, mas não tenho ideia de como fazer isso. E também não entendo por que o VSCode funciona de maneira diferente do Visual Studio nesse aspecto.