我有一个控制器,它有一个路由动作,如下所示:
Route("{resourceType}/{id}")
我的DLL有一些辅助类,例如由另一个asp .net核心应用程序使用,现在因为该应用程序也有类似的路由所以间接我的控制器开始与它们冲突
我在web api中解决了这个问题,将我的控制器标记为内部,并在IHttpControllerTypeResolver的实现中为我的应用程序选择了这个控制器。
目前我将我的代码转移到asp .net core 2.0,我遇到了类似的问题,我试图使用下面的代码处理这个问题 -
serverInstance = new WebHostBuilder().
UseConfiguration(config)
.UseKestrel()
.UseStartup<Startup>()
.ConfigureServices(collection => {
// only fhir controller in cloud.
collection.AddMvc().ConfigureApplicationPartManager(manager =>
manager.ApplicationParts.Clear())
.ConfigureApplicationPartManager(manager => {
manager.ApplicationParts
.Add(new TypesPart(typeof(FhirController)));
collection.AddSingleton<IFhirConfiguration>(inputConfig);
})
.AddControllersAsServices();
})
.Build();
但上面的代码没有帮助,如果FhirController是内部代码,则不会被检测到,如果它是公共的,它是否有效,任何想法如何解决它?
听起来你说你是从另一个ASP.NET Core项目引用一个ASP.NET Core项目,因为第一个有你想在第二个中使用的一些帮助类。如果是这种情况,请不要这样做。如果两个项目都需要访问这些帮助程序类,请将它们分解为两个项目都可以引用的类库。
通过引用整个Web应用程序项目,您将获得过多的渗透,以及您现在遇到的问题。
如果FhirController是内部的,则不会被检测到,如果它是公共的,它是否有效,任何想法如何解决它?
显然,如果您希望其他人使用它,则必须将控制器标记为公开。针对实际问题的这种解决方法不起作用。
问题是您的路线太宽,会阻止其他路线运转。相反,修复你的路线:
Route("{resourceType}/{id}")
此路线将匹配任何2段网址,例如foo/bar
或abc/123
。
如果您希望它与其他人的代码一起使用,则需要将其约束为代码使用的特定URL。有关如何解决此问题的想法,请参阅Why map special routes first before common routes in asp.net mvc?(请注意,虽然它适用于MVC 5,但同样的逻辑仍适用于.NET Core)。
最简单的解决方法是使用文字段以确保它仅在段中找到特定字符串时匹配:
Route("MyResourceType/{id}")
如果您需要更多灵活性,则可能需要使用route constraint。对于更高级的匹配逻辑,您可以使用custom IRouter。
注意:第一场比赛获胜。因此,您还必须通过在使用它的应用程序的路由之前注册它来确保您的路由有机会运行。