Asp.net核心内部控制器

时间:2018-02-28 12:24:52

标签: c# asp.net-core controller asp.net-core-2.0

我有一个控制器,它有一个路线动作,如下所示:

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,如果它是公共的,它是否有效,任何想法我该如何解决?

2 个答案:

答案 0 :(得分:1)

听起来你说你是从另一个ASP.NET Core项目引用一个ASP.NET Core项目,因为第一个有你想要在第二个中使用的一些帮助类。如果是这样的话,不要这样做。如果两个项目都需要访问这些帮助程序类,请将它们分解为两个项目都可以引用的类库。

通过引用整个Web应用程序项目,您将会遇到过多的问题,以及您现在遇到的问题。

答案 1 :(得分:0)

  

如果它是内部,则不会检测到FhirController,如果它是公共的,它是否正常工作,我知道如何解决它?

显然,如果您希望其他人使用它,则必须将控制器标记为公开。实际问题的解决方法不起作用。

问题是您的路线太宽,会阻止其他路线运转。相反,修复你的路线:

Route("{resourceType}/{id}")

此路线将匹配任何 2段网址,例如foo/barabc/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

  

注意:第一场比赛获胜。因此,您还必须通过在使用它的应用程序的路径之前注册来确保您的路由有机会运行。