【问题标题】:ControllerFeatureProvider not filter controllers by nameControllerFeatureProvider 不按名称过滤控制器
【发布时间】:2020-08-11 19:55:06
【问题描述】:

我想过滤我的控制器以在 NET 5 预览版中删除处于 RELEASE 模式的测试控制器。 看起来过滤器类中的一切工作正常(为“TestingController”返回 false),但我的控制器在 RELEASE 模式下仍然可用。

我从一个类库项目中使用这个过滤器类:

public class TestingControllerFeatureProvider : ControllerFeatureProvider
{
    public TestingControllerFeatureProvider()
    {
    }

    protected override bool IsController(TypeInfo typeInfo)
    {
        if (typeInfo != null && typeInfo.Name.ToLower().Contains("testing"))
        {
            return false;
        }

        return base.IsController(typeInfo);
    }
}

以及startup.cs中的这段代码:

IMvcCoreBuilder MVC = services.AddMvcCore();

#if RELEASE
            MVC.ConfigureApplicationPartManager(m =>
            {
                m.FeatureProviders.Add(new TestingControllerFeatureProvider());
            });
#endif

我做错了什么?感谢您的帮助!

【问题讨论】:

  • 什么情况下需要删除包含‘testing’的控制器
  • @YiyiYou 在调试模式下我有帮助控制器来管理使用 cypress 测试器在单独的 razor 类库中的测试方法。我想在发布模式(生产中)禁用这些控制器。

标签: c# asp.net-core model-view-controller class-library .net-5


【解决方案1】:

我认为你可以使用 MiddleWare 来做到这一点。首先你可以在 appsettings.json 中设置一个UseTesting。 这是一个演示:

appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "UseTesting": 1
}

Startup.cs:

 app.UseHttpsRedirection();
            if (Int32.Parse(Configuration["UseTesting"]).Equals(1)) {
                app.Use(async (context, next) =>
                {
                    // Do work that doesn't write to the Response.
                    if (context.Request.Path.Value.ToString().Split("/")[1].Contains("Test"))
                    {
                        context.Response.StatusCode = 404;
                        return;
                    }
                    await next.Invoke();
                    // Do logging or other work that doesn't write to the Response.
                });
            }

在发布模式下,您可以在appsettings.json中将UseTesting值更改为1。

结果(我在 UseTesting=1 和 UseTesting =0 时进行测试):

【讨论】:

  • 谢谢,看起来很好,但我有两个小问题:这段代码不仅过滤了控制器,还过滤了每个请求(css文件等)。我的第二个问题:如果变量设置为 0,我会看到一个空页面而不是 404 页面,在我的情况下看起来中间件链被“return”部分破坏了。
  • 首先,我测试css文件,它不会被中间件过滤。其次,我在return之前使用context.Response.StatusCode = 404;,然后它会返回一个默认的404页面。你可以试试url 不存在,它将返回一个与我在答案中显示的页面相同的页面。
  • 在我的第二次测试中,只有控制器被过滤了,我将对其进行深入测试。但是对我来说仍然出现空页面,而不是404页面,你的中间件的顺序是什么?
  • 好的,现在它可以使用自定义 StatusCodePages 和错误处理...感谢您的帮助!
  • 我已经用 +1 点标记它,但我还要等待修复原始功能提供程序代码的建议。
猜你喜欢
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 2015-12-11
  • 2011-03-14
相关资源
最近更新 更多