O caminho da solicitação não corresponde a um tipo de arquivo compatível

Aug 18 2020

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

JohnThiesen Aug 19 2020 at 06:46

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.