相关疑难解决方法(0)

.NET WebAPI属性路由和继承

我正在使用一个基本控制器的想法,该控制器使用通用存储库为我的API控制器提供基本的CRUD方法,这样我就不必在每个新控制器中复制相同的基本代码.但是,当它在基本控制器中时,会遇到路由属性被识别的问题.为了准确显示我遇到的问题,我创建了一个非常简单的WebAPI控制器.

当我在主控制器中有Get方法并且它直接从ApiController继承时,我没有任何问题,这可以按预期工作.

[RoutePrefix("admin/test")]
public class TestController : ApiController
{
    [Route("{id:int:min(1)}")]
    public string Get(int id)
    {
        return "Success";
    }
}
Run Code Online (Sandbox Code Playgroud)

当我将Get方法移动到基本控制器时,它返回404页面的内容.

[RoutePrefix("admin/test")]
public class TestController : TestBaseController
{

}

public class TestBaseController : ApiController
{
    [Route("{id:int:min(1)}")]
    public string Get(int id)
    {
        return "Success";
    }
}
Run Code Online (Sandbox Code Playgroud)

一些更有趣的笔记:

  • 我可以在GET/Test/1上访问该操作.所以它仍然基于默认路线找到它.

  • 当我尝试访问POST/admin/test时,它返回以下JSON

    {"Message":"找不到与请求URI匹配的HTTP资源' http://test.com/admin/test'.","MessageDetail ":"找不到与名为'admin'的控制器匹配的类型. " }

有没有人知道如何让路由使用基本控制器的属性?

asp.net-web-api asp.net-web-api-routing

64
推荐指数
2
解决办法
3万
查看次数

WebApi2属性路由继承了控制器

我正在尝试使用基本控制器创建基本的REST api,如下所示:

基类:

public abstract class WebApiEntityController<TEntity> : ApiController
    where TEntity : EntityBase<TEntity, int>
{
    private readonly IRepository<TEntity> _repository; 
    protected WebApiEntityController(IRepository<TEntity> repository)
    {
        _repository = repository;
    }

    [Route("")]
    [WebApiUnitOfWork]
    public HttpResponseMessage Get()
    {
        return Request.CreateResponse(HttpStatusCode.OK, _repository.ToList());
    }
    [..........]
Run Code Online (Sandbox Code Playgroud)

派生类:

[RoutePrefix("api/TimesheetTask")]
public class TimesheetTaskController : WebApiEntityController<TimesheetTask>
{
    private readonly IRepository<TimesheetTask> _timeSheetTaskRepository;

    public TimesheetTaskController(IRepository<TimesheetTask> timeSheetTaskRepository) : base(timeSheetTaskRepository)
    {
        _timeSheetTaskRepository = timeSheetTaskRepository;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是在路由〜/ api/TimesheetTask /上调用GET导致找不到404.

根据这个答案,属性路由不能被继承.所以我的问题是,如何为所有域模型编写一致的API而无需复制和粘贴代码?

我知道我可以使用这种配置进行常规路由:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional } …
Run Code Online (Sandbox Code Playgroud)

c# asp.net routing asp.net-web-api asp.net-web-api2

4
推荐指数
1
解决办法
1537
查看次数