Путь запроса не соответствует поддерживаемому типу файла
Я новичок в .Net Core MVC. Я пытаюсь добавить контроллер в существующий проект, но получаю сообщение об ошибке
dbug: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[4]
The request path https://localhost:5001/api/admin/... does not match a supported file type
Это заставляет меня думать, что дело даже не в самом приложении, а где-то в каком-то промежуточном программном обеспечении. Или почему он жалуется на тип файла? Здесь нет никакого «типа», это просто строка, содержащая URL.
В VSCode я добавил новый контроллер в ту же папку с существующими контроллерами, и сборка прошла нормально. Ctrl-F5 вызывает его в моем браузере, и я могу запускать старые API (по крайней мере, те, которые я пробовал), но не новый; он дает 404, если я использую URL-адрес нового контроллера.
Здесь также установлен Swagger, и Swagger показывает старые API, но не новый.
В Startup.cs есть
app.UseRouting();
а также
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();
});
Это .Net Core 3.1.302 и VSCode 1.48.0 в Windows 10.
Читая руководства, я подумал, что все, что мне нужно сделать для добавления контроллера, - это написать код (точно смоделированный на существующем работающем контроллере) и построить его. Но должен быть какой-то дополнительный шаг для регистрации или регистрации нового контроллера?
Это правильный метод настройки? Из 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;
}
Ответы
Что ж, у меня есть частичный ответ на этот вопрос, который я не совсем понимаю. Я работал в VSCode. Я создал новый файл для своего PatientListController и поместил его в соответствующее место в файле hieracharcy, и получил сообщения об ошибках, описанные выше (плюс тот факт, что он не отображался в Swagger).
Но если я работаю в Visual Studio (с которой я менее знаком), когда я пытаюсь создать новый файл, он конкретно спрашивает меня, что я создаю, и я выбираю контроллер из списка.
В VSCode, очевидно, он не знает, что это за новый файл, поэтому компилятор просто игнорирует его. Таким образом, в скомпилированном коде нет следов нового контроллера.
В Visual Studio компилятор знает, что я добавил новый контроллер, и точно такой же код работает нормально, а новый api отображается в Swagger.
Так что в VSCode должен быть какой-то способ сигнализировать, что делать с новым файлом, но я понятия не имею, как заставить его это сделать. И я также не понимаю, почему в этом отношении VSCode работает иначе, чем Visual Studio.