Маршрутизация ASP.NET Core MVC на контроллер не работает после конфликта имен
Изначально у меня было 2 контроллера с одинаковым именем "AgreementController", но один находился в пространстве имен "API". Это вызвало ошибки при маршрутизации, используя настройки ниже:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "ActionApi",
template: "api/{controller}/{action}/{id?}");
});
Чтобы решить эту проблему, я переименовал одно в пространстве имен "API" в "AgreementAPIController", но по какой-то причине я все еще не могу перенаправить на "/Agreement/Create/? CustomerId=1234", хотя контроллеры выглядят так:
public class AgreementController : Controller
{
private readonly IMapper _mapper;
public AgreementController(IMapper mapper)
{
_mapper = mapper;
}
[HttpGet]
public IActionResult Create(int customerId)
{
return View(customerId);
}
}
а также
public class AgreementAPIController : Controller
{
private readonly IMapper _mapper;
public AgreementAPIController(IMapper mapper)
{
_mapper = mapper;
}
[HttpGet]
public IActionResult Test()
{
return View();
}
Если я также переименую "AgreementController" в "AgreementXController", то все будет нормально. Почему я должен переименовать оба контроллера? Где-то есть кеш, который хранит старые имена?
Это полный файл Startup.cs.
public class Startup
{
public Startup(IConfiguration configuration, IHostingEnvironment environment)
{
Configuration = configuration;
Environment = environment;
}
public IConfiguration Configuration { get; }
public IHostingEnvironment Environment { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IRFDbRepository, RFDbRepository>();
var connection = Configuration.GetConnectionString("RFDbConnection");
services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
services.AddDbContext<RFDbContext>(options => options.UseSqlServer(connection));
services.AddDbContext<IdentityDbContext>(options => options.UseSqlServer(connection));
services.AddIdentity<User, UserRole>().AddDefaultTokenProviders();
services.AddTransient<IUserStore<User>, UserStore>();
services.AddTransient<IRoleStore<UserRole>, RoleStore>();
services.AddAutoMapper();
services.AddAuthorization(x =>
{
if (Configuration.GetValue<bool>("DisableAuthentication") && Environment.IsDevelopment())
{
x.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAssertion(_ => true)
.Build();
}
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddRazorPagesOptions(options =>
{
options.AllowAreas = true;
options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
});
services.ConfigureApplicationCookie(options =>
{
options.Cookie.HttpOnly = true;
options.LoginPath = "/Identity/Account/Login";
options.LogoutPath = "/Identity/Account/Logout";
options.ExpireTimeSpan = TimeSpan.FromMinutes(Configuration.GetValue<int>("AuthenticationCookie:ExpiryMinutes"));
options.SlidingExpiration = Configuration.GetValue<bool>("AuthenticationCookie:SlidingExpiration");
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IRFDbRepository rFDbRepository)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
loggerFactory.AddFile(Configuration.GetValue<string>("Logging:LogFile"));
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "ActionApi",
template: "api/{controller}/{action}/{id?}");
});
rFDbRepository.TestConnection();
}
}