เส้นทางการร้องขอไม่ตรงกับประเภทไฟล์ที่รองรับ

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

สิ่งนี้ทำให้ฉันคิดว่ามันไม่ได้เข้าสู่แอพ แต่ถูกบล็อกในมิดเดิลแวร์บางประเภท หรือทำไมถึงบ่นเกี่ยวกับประเภทไฟล์? ที่นี่ไม่มี "type" เป็นเพียงสตริงที่มี URL

ใน VSCode ฉันได้เพิ่มคอนโทรลเลอร์ใหม่ในโฟลเดอร์เดียวกันกับคอนโทรลเลอร์ที่มีอยู่และบิลด์ก็ทำงานได้ดี Ctrl-F5 เปิดขึ้นมาในเบราว์เซอร์ของฉันและฉันสามารถเรียกใช้ API เก่า (อย่างน้อยก็ที่ฉันลอง) แต่ไม่ใช่อันใหม่ มันให้ 404 ถ้าฉันใช้ URL กับคอนโทรลเลอร์ใหม่

นอกจากนี้ยังมีการติดตั้ง Swagger และ Swagger จะแสดง API เก่า แต่ไม่ใช่ 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 ของฉันและวางไว้ในตำแหน่งที่เหมาะสมในการซ่อนไฟล์และได้รับข้อความแสดงข้อผิดพลาดที่อธิบายไว้ข้างต้น (บวกกับข้อเท็จจริงที่ว่ามันไม่ปรากฏใน Swagger)

แต่ถ้าฉันทำงานใน Visual Studio (ซึ่งฉันไม่ค่อยคุ้นเคย) เมื่อฉันพยายามสร้างไฟล์ใหม่มันจะถามฉันเป็นพิเศษว่าฉันกำลังสร้างอะไรและฉันเลือกคอนโทรลเลอร์จากรายการ

ใน VSCode เห็นได้ชัดว่ามันไม่รู้ว่าไฟล์ใหม่นี้คืออะไรคอมไพเลอร์จึงเพิกเฉย ดังนั้นโค้ดที่คอมไพล์จึงไม่มีร่องรอยของคอนโทรลเลอร์ใหม่

ใน Visual Studio คอมไพเลอร์รู้ว่าฉันได้เพิ่มคอนโทรลเลอร์ใหม่แล้วและโค้ดเดียวกันก็ใช้ได้ดีและ api ใหม่จะปรากฏใน Swagger

ดังนั้นต้องมีวิธีบางอย่างใน VSCode เพื่อส่งสัญญาณว่าจะทำอย่างไรกับไฟล์ใหม่ แต่ฉันไม่รู้ว่าจะทำอย่างไร และฉันก็ไม่เข้าใจเหมือนกันว่าทำไม VSCode ถึงทำงานแตกต่างจาก Visual Studio ในแง่นั้น