【问题标题】:Create a controller programmatically以编程方式创建控制器
【发布时间】:2017-12-11 16:01:43
【问题描述】:

已经决定我们应该有一个跨不同应用程序的通用上传 http api。我有一个文件上传控制器,我想在多个 webapi 项目中使用它。

我的上传控制器看起来像这样

namespace MyNamespace
{
    [Authorize("PolicyName")]
    [Route("Upload")]
    public class UploadController : Controller
    {
        [HttpPost]
        [Route("Upload")]
        public async Task<IActionResult> Upload(UploadModel model)
        {
             // impl..
             return Ok();
        }
    }
}

我天真地以为我只要把它提取到一个类库中就可以注册它,但我找不到怎么做?

无论如何,我认为这不是正确的使用方法。我希望能够配置授权策略名称,并可能配置路由。所以我想我可能想建立控制器、它的路由和授权设置并注册它一些如何?

我对 api 的想法是......

((IApplicationBuilder)app).UseUploadController(config => {
    config.PolicyName = "Whatever",
    config.UploadRoute = "UploadStuff"
});

... 这将创建并注册控制器。不知道从哪里开始。我完全不知道控制器是如何被发现的,或者它们是否可以通过编程方式注册。

任何人有任何指针或库来寻找灵感?

【问题讨论】:

    标签: c# asp.net asp.net-core asp.net-core-webapi


    【解决方案1】:

    您可以将您的控制器放在您引用的类库中(如您所愿),然后在任何项目中您都可以从您想要的那个控制器继承。如果您不想要任何其他功能,您可以将子类留空,但如果您想添加一些东西,您可以轻松扩展它。 此外,您可以使用任何其他名称的控制器,并可以设置不同的路由、授权等。

    【讨论】:

    • 我怎么没想到!!非常简单,也意味着权限等位于相似的位置——即在控制器上。我将保留这个问题,因为我仍然想知道我提出的建议是否可行。
    【解决方案2】:

    如果您在不同的程序集中有一个控制器,那么您可以通过添加正确的引用和修改路由让您的 MVC 应用程序发现它,如 this answer 中所述

    至于配置,传递给属性的值需要是编译时常量,因此您不能在运行 MVC 应用程序时动态设置它们。您可以创建一个自定义属性来实现您的逻辑。所以对于Authorize,你会有这样的东西:

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public class SetPermissionsAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            // Get everyting you need, for example from Web.config
        }
    
        (...)
    }
    

    正如代码 sn-p 的注释中所述,不同的应用程序可以存储动态值,例如作为 Web.config 设置,您可以在属性中读取这些值。

    Example的自定义AuthorizeAttribute

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多