具有相同名称“upload”的属性路由必须具有相同的模板

nhu*_*uvy 4 c# asp.net-core

我有 2 个控制器

\n
using Microsoft.AspNetCore.Authorization;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.Extensions.Configuration;\nusing shadow.Data;\nusing shadow.DTO;\nusing shadow.Models;\nusing shadow.Services;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace shadow.Controllers\n{\n    [Route("[controller]")]\n    [ApiController]\n    public class UserTrustedPersonController : ControllerBase\n    {\n        private IUserService _userService;\n        private IMailService _mailService;\n        private IConfiguration _configuration;\n        private ApplicationDbContext _db;\n\n        public static IWebHostEnvironment _environment;\n\n        public UserTrustedPersonController(IUserService userService, IMailService mailService, IConfiguration configuration, ApplicationDbContext db, IWebHostEnvironment environment)\n        {\n            _userService = userService;\n            _mailService = mailService;\n            _configuration = configuration;\n            _db = db;\n            _environment = environment;\n        }\n\n        public class FileUploadAPI\n        {\n            public IFormFile files { get; set; }\n        }\n\n        [HttpPost]\n        [Route("upload2")]\n        [Obsolete]\n        public async Task<string> Post(FileUploadAPI objFile)\n        {\n            try\n            {\n                if (objFile.files.Length > 0)\n                {\n                    if (!Directory.Exists(_environment.WebRootPath + "\\\\Upload\\\\"))\n                    {\n                        Directory.CreateDirectory(_environment.WebRootPath + "\\\\Upload\\\\");\n                    }\n                    using (FileStream fileStream = System.IO.File.Create(_environment.WebRootPath + "\\\\Upload\\\\" + objFile.files.FileName))\n                    {\n                        objFile.files.CopyTo(fileStream);\n                        fileStream.Flush();\n                        return "\\\\Upload\\\\" + objFile.files.FileName;\n                    }\n                }\n                else\n                {\n                    return "Failed";\n                }\n            }\n            catch (Exception ex)\n            {\n                return ex.Message.ToString();\n            }\n        }\n\n        // Upload file \xe1\xba\xa3nh.\n        [HttpPost("upload", Name = "upload")]\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)]\n        public async Task<IActionResult> UploadFile(IFormFile file, CancellationToken cancellationToken)\n        {\n            if (CheckIfExcelFile(file))\n            {\n                await WriteFile(file);\n            }\n            else\n            {\n                return BadRequest(new { message = "Invalid file extension" });\n            }\n            return Ok();\n        }\n\n        /// <summary>\n        /// Method to check if file is excel file\n        /// </summary>\n        /// <param name="file"></param>\n        /// <returns></returns>\n        private bool CheckIfExcelFile(IFormFile file)\n        {\n            var extension = "." + file.FileName.Split('.')[file.FileName.Split('.').Length - 1];\n            return (extension == ".png" || extension == ".jpg" || extension == ".bmp" || extension == ".gif" || extension == ".tif"); // Change the extension based on your need\n        }\n\n        //private async Task<bool> WriteFile(IFormFile file)\n        private async Task<string> WriteFile(IFormFile file)\n        {\n            bool isSaveSuccess = false;\n            string fileName;\n            string filePath ="";\n            try\n            {\n                var extension = "." + file.FileName.Split('.')[file.FileName.Split('.').Length - 1];\n                fileName = DateTime.Now.Ticks + extension; //Create a new Name for the file due to security reasons.\n                var pathBuilt = Path.Combine(Directory.GetCurrentDirectory(), "Upload\\\\files");\n                if (!Directory.Exists(pathBuilt))\n                {\n                    Directory.CreateDirectory(pathBuilt);\n                }\n                var path = Path.Combine(Directory.GetCurrentDirectory(), "Upload\\\\files", fileName);\n                filePath = path;\n                using (var stream = new FileStream(path, FileMode.Create))\n                {\n                    await file.CopyToAsync(stream);\n                }\n                isSaveSuccess = true;\n            }\n            catch (Exception e)\n            {\n                //log error\n            }\n            //return isSaveSuccess;\n            return filePath;\n        }\n\n    }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

\n
using Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.Configuration;\nusing shadow.Data;\nusing shadow.Models;\nusing shadow.Services;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace shadow.Controllers\n{\n\n    [Route("[controller]")]\n    [ApiController]\n    public class ImageFileController : ControllerBase\n    {\n        private IUserService _userService;\n        private IMailService _mailService;\n        private IConfiguration _configuration;\n        private ApplicationDbContext _db;\n\n        public ImageFileController(IUserService userService, IMailService mailService, IConfiguration configuration, ApplicationDbContext context /*, SignInManager<IdentityUser> signInManager */)\n        {\n            _userService = userService;\n            _mailService = mailService;\n            _configuration = configuration;\n            _db = context;\n            // _signInManager = signInManager;\n        }\n\n        [HttpPost]\n        public async Task<ActionResult<ImageFile>> AddImage(ImageFile imageItem)\n        {\n            var item = new ImageFile\n            {\n                //Fullname = trustedPerson.Fullname,\n               \n            };\n            _db.ImageFiles.Add(item);\n            await _db.SaveChangesAsync(); \n            return item;\n        }\n\n        // Upload file \xe1\xba\xa3nh.\n        [HttpPost("upload", Name = "upload")]\n        [ProducesResponseType(StatusCodes.Status200OK)]\n        [ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)]\n        public async Task<IActionResult> UploadFile(IFormFile file, CancellationToken cancellationToken)\n        {\n            if (CheckIfExcelFile(file))\n            {\n                await WriteFile(file);\n            }\n            else\n            {\n                return BadRequest(new { message = "Invalid file extension" });\n            }\n            return Ok();\n        }\n\n        /// <summary>\n        /// Method to check if file is excel file\n        /// </summary>\n        /// <param name="file"></param>\n        /// <returns></returns>\n        private bool CheckIfExcelFile(IFormFile file)\n        {\n            var extension = "." + file.FileName.Split('.')[file.FileName.Split('.').Length - 1];\n            return (extension == ".png" || extension == ".jpg" || extension == ".bmp" || extension == ".gif" || extension == ".tif"); // Change the extension based on your need\n        }\n\n        //private async Task<bool> WriteFile(IFormFile file)\n        private async Task<string> WriteFile(IFormFile file)\n        {\n            bool isSaveSuccess = false;\n            string fileName;\n            string filePath = "";\n            try\n            {\n                var extension = "." + file.FileName.Split('.')[file.FileName.Split('.').Length - 1];\n                fileName = DateTime.Now.Ticks + extension; //Create a new Name for the file due to security reasons.\n                var pathBuilt = Path.Combine(Directory.GetCurrentDirectory(), "Upload\\\\files");\n                if (!Directory.Exists(pathBuilt))\n                {\n                    Directory.CreateDirectory(pathBuilt);\n                }\n                var path = Path.Combine(Directory.GetCurrentDirectory(), "Upload\\\\files", fileName);\n                filePath = path;\n                using (var stream = new FileStream(path, FileMode.Create))\n                {\n                    await file.CopyToAsync(stream);\n                }\n                isSaveSuccess = true;\n            }\n            catch (Exception e)\n            {\n                //log error\n            }\n            //return isSaveSuccess;\n            return filePath;\n        }\n\n    }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

错误

\n
System.InvalidOperationException\n  HResult=0x80131509\n  Message=The following errors occurred with attribute routing information:\n\nError 1:\nAttribute routes with the same name 'upload' must have the same template:\nAction: 'shadow.Controllers.ImageFileController.UploadFile (shadow)' - Template: 'upload'\nAction: 'shadow.Controllers.UserTrustedPersonController.UploadFile (shadow)' - Template: 'UserTrustedPerson/upload'\n  Source=Microsoft.AspNetCore.Mvc.Core\n  StackTrace:\n   at Microsoft.AspNetCore.Mvc.ApplicationModels.ApplicationModelFactory.Flatten[TResult](ApplicationModel application, Func`5 flattener)\n   at Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerActionDescriptorBuilder.Build(ApplicationModel application)\n   at Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerActionDescriptorProvider.GetDescriptors()\n   at Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerActionDescriptorProvider.OnProvidersExecuting(ActionDescriptorProviderContext context)\n   at Microsoft.AspNetCore.Mvc.Infrastructure.DefaultActionDescriptorCollectionProvider.UpdateCollection()\n   at Microsoft.AspNetCore.Mvc.Infrastructure.DefaultActionDescriptorCollectionProvider.Initialize()\n   at Microsoft.AspNetCore.Mvc.Infrastructure.DefaultActionDescriptorCollectionProvider.GetChangeToken()\n   at Microsoft.AspNetCore.Mvc.Routing.ActionEndpointDataSourceBase.<>c__DisplayClass11_0.<Subscribe>b__0()\n   at Microsoft.Extensions.Primitives.ChangeToken.OnChange(Func`1 changeTokenProducer, Action changeTokenConsumer)\n   at Microsoft.AspNetCore.Mvc.Routing.ActionEndpointDataSourceBase.Subscribe()\n   at Microsoft.AspNetCore.Mvc.Routing.ControllerActionEndpointDataSource..ctor(IActionDescriptorCollectionProvider actions, ActionEndpointFactory endpointFactory)\n   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)\n   at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)\n   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)\n   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)\n   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)\n   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)\n   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)\n   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)\n   at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)\n   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)\n   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)\n   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)\n   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)\n   at Microsoft.AspNetCore.Builder.ControllerEndpointRouteBuilderExtensions.GetOrCreateDataSource(IEndpointRouteBuilder endpoints)\n   at Microsoft.AspNetCore.Builder.ControllerEndpointRouteBuilderExtensions.MapControllers(IEndpointRouteBuilder endpoints)\n   at shadow.Startup.<>c.<Configure>b__5_0(IEndpointRouteBuilder endpoints) in D:\\shadow_backend\\Startup.cs:line 120\n   at Microsoft.AspNetCore.Builder.EndpointRoutingApplicationBuilderExtensions.UseEndpoints(IApplicationBuilder builder, Action`1 configure)\n   at shadow.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env) in D:\\shadow_backend\\Startup.cs:line 118\n   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)\n   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)\n   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)\n   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.<Build>b__0(IApplicationBuilder builder)\n   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.<UseStartup>b__2(IApplicationBuilder app)\n   at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.<Configure>g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)\n   at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)\n   at Microsoft.AspNetCore.Hosting.GenericWebHostService.<StartAsync>d__31.MoveNext()\n
Run Code Online (Sandbox Code Playgroud)\n

uni*_*lau 8

在您的代码示例中,您使用以下方式声明路线:

\n

[HttpPost("upload", Name = "upload")](用户控制器)
\n [HttpPost("upload", Name = "upload")](图像控制器)

\n

您可以通过以不同的方式声明路线来解决问题并防止冲突:

\n

\xe2\x9c\x94 [HttpPost, Route("[controller]/upload")](用户控制器)
\n\xe2\x9c\x94[HttpPost, Route("[controller]/upload")](图像控制器)

\n

有用的阅读:

\n

https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-5.0#route-name

\n

https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-5.0#set-up-conventional-route

\n