如何调用通用的WebApi控制器?

时间:2018-01-11 07:05:27

标签: c# .net generics asp.net-web-api

我正在尝试实现一个用于所有模型的通用API控制器。

public class DefaultController<T> : ApiController
{
    // GET: api/Default
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET: api/Default/5
    public string Get(int id)
    {
        return "value";
    }
}

当我调用localhost:xxxxxx / api / Default时。它抛出错误

No type was found that matches the controller named 'Default'.

有人可以指导我正确的实施方式。

另外,如何在调用API时指定类型?

感谢。

2 个答案:

答案 0 :(得分:2)

如果这是您的Generic API Controller (Base Controller)

[Route("api/[controller]")]
public class DefaultController<T> : ApiController
{
    // GET: api/{ControllerName}
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "first", "second" };
    }

    // GET: api/{ControllerName}/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        return "value";
    }
}

您可以使用Posts的基本控制器:

public class PostsController : DefaultController<Post> {}

或者用于其他人,例如Comments

public class CommentsController : DefaultController<Comment> {}

您可以调用控制器操作localhost:xxxx/api/postslocalhost:xxxx/api/posts/5localhost:xxxx/api/commentslocalhost:xxxx/api/comments/12

答案 1 :(得分:0)

尝试从通用基本控制器继承。

public class MyBaseController<T> : ApiController
{
    // GET: api/Default
    public IEnumerable<T> Get()
    {
        return callGenericMethod<T>();
    }
}  

现在可以根据需要创建任意数量的控制器:

public class DefaultController : MyBaseController<MySpecificType>
{
   //add extra specific methods here or depend on the inherited ones only.
}  

调用控制器与调用非通用控制器相同:

yourApiPath/Default/Get