自定义控制器选择器和属性路由

时间:2018-01-26 08:55:09

标签: asp.net-web-api-routing

我开发了WebAPI应用程序,我需要使用自定义控制器选择器,所以我创建了这个:

public class CustomControllerSelector : DefaultHttpControllerSelector
{
    (...)

    public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
    {
        // It's just a simplified logic which exemplify the problem
        var controller =_controllerAssembly.GetType("App.Controllers.MyController");
        return new HttpControllerDescriptor(this.httpConfiguration, controller.Name, controller);
    }
}

我的控制器包含两个GET方法:

public class MyController : System.Web.Http.ApiController
{
    [Route("~/api/myController/GetAll")]
    public IEnumerable<MyModel> GetAll(){ ... }

    public MyModel Get(){ ... }
}

不幸的是,当我去 http:// localhost / api / myController / 时,我收到错误:

  

找到符合请求的多项操作:

     

GetAll类型App.Controllers.MyController

     

获取App.Controllers.MyController类型&#34;

但是如果我去 http:// localhost / api / myController / GetAll ,它会按预期工作,并返回对象的集合。

值得一提的是,如果我不使用自定义控制器选择器,它就像魅力一样,两个动作都会给出有效的响应。

您知道为什么自定义控制器选择器(从默认选择器派生)会导致此问题吗?

解决方法:

由于原始(默认)控制器选择器已正确初始化并按预期工作,因此我将其聚合而不是从中继承。

class CustomControllerSelector : IHttpControllerSelector 
{ 
    private DefaultHttpControllerSelector defaultSelector; 

    public CustomControllerSelector(DefaultHttpControllerSelector defaultSelector)
    { 
        (...) 
}

0 个答案:

没有答案