La ruta de solicitud no coincide con un tipo de archivo admitido

Aug 18 2020

Soy nuevo en .Net Core MVC. Estoy intentando agregar un controlador a un proyecto existente, pero obtengo el error

dbug: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[4]
The request path https://localhost:5001/api/admin/... does not match a supported file type

Esto me hace pensar que ni siquiera llega a la aplicación en sí, sino que se bloquea en algún tipo de middleware en alguna parte. O, ¿por qué se queja del tipo de archivo? No hay "tipo" involucrado aquí, es solo una cadena que contiene una URL.

En VSCode agregué el nuevo controlador en la misma carpeta con los controladores existentes, y la compilación funcionó bien. Ctrl-F5 lo abre en mi navegador y puedo ejecutar las API antiguas (al menos las que probé) pero no la nueva; da un 404 si uso una URL para el nuevo controlador.

Esto también tiene Swagger instalado, y Swagger muestra las API antiguas pero no la nueva.

En Startup.cs tiene

app.UseRouting();

y también

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();
            });

Esto es .Net Core 3.1.302 y VSCode 1.48.0 en Windows 10.

Al leer los tutoriales, pensé que todo lo que tenía que hacer para agregar un controlador era escribir el código (modelado de cerca en un controlador existente que funciona) y construirlo. ¿Pero debe haber algún paso adicional para registrar o registrar el nuevo controlador en algún lugar?

¿Es este el método de configuración correcto? Desde 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;
        }

Respuestas

JohnThiesen Aug 19 2020 at 06:46

Bueno, tengo una respuesta parcial a esto que no entiendo del todo. Estaba trabajando en VSCode. Creé un nuevo archivo para mi PatientListController y lo puse en el lugar apropiado en la jerarquía del archivo, y obtuve los mensajes de error descritos anteriormente (más el hecho de que no apareció en Swagger).

Pero si trabajo en Visual Studio (con el que estoy menos familiarizado), cuando intento crear un nuevo archivo, me pregunta específicamente qué estoy creando y elijo Controlador de la lista.

En VSCode, aparentemente no sabe qué es este nuevo archivo, por lo que el compilador simplemente lo ignora. Entonces, el código compilado no tiene rastro del nuevo controlador.

En Visual Studio, el compilador sabe que he agregado un nuevo controlador y exactamente el mismo código funciona bien y la nueva API aparece en Swagger.

Entonces, debe haber alguna forma en VSCode para indicar qué hacer con el nuevo archivo, pero no tengo idea de cómo hacerlo. Y tampoco entiendo por qué VSCode funciona de manera diferente a Visual Studio en ese sentido.