Путь запроса не соответствует поддерживаемому типу файла

Aug 18 2020

Я новичок в .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;
        }

Ответы

JohnThiesen Aug 19 2020 at 06:46

Что ж, у меня есть частичный ответ на этот вопрос, который я не совсем понимаю. Я работал в VSCode. Я создал новый файл для своего PatientListController и поместил его в соответствующее место в файле hieracharcy, и получил сообщения об ошибках, описанные выше (плюс тот факт, что он не отображался в Swagger).

Но если я работаю в Visual Studio (с которой я менее знаком), когда я пытаюсь создать новый файл, он конкретно спрашивает меня, что я создаю, и я выбираю контроллер из списка.

В VSCode, очевидно, он не знает, что это за новый файл, поэтому компилятор просто игнорирует его. Таким образом, в скомпилированном коде нет следов нового контроллера.

В Visual Studio компилятор знает, что я добавил новый контроллер, и точно такой же код работает нормально, а новый api отображается в Swagger.

Так что в VSCode должен быть какой-то способ сигнализировать, что делать с новым файлом, но я понятия не имею, как заставить его это сделать. И я также не понимаю, почему в этом отношении VSCode работает иначе, чем Visual Studio.