【发布时间】:2013-11-28 03:13:45
【问题描述】:
我正在考虑使用通用存储库为我的 API 控制器提供基本 CRUD 方法的基本控制器的想法,这样我就不必在每个新控制器中复制相同的基本代码。但是当路由属性在基本控制器中时,我遇到了识别路由属性的问题。为了准确显示我遇到的问题,我创建了一个非常简单的 WebAPI 控制器。
当我在主控制器中有一个 Get 方法并且它直接从 ApiController 继承时,我没有任何问题,并且按预期工作。
[RoutePrefix("admin/test")]
public class TestController : ApiController
{
[Route("{id:int:min(1)}")]
public string Get(int id)
{
return "Success";
}
}
当我将 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";
}
}
一些更有趣的笔记:
我可以通过
GET/Test/1访问该操作。所以它仍然根据默认路由找到它。-
当我尝试访问
POST/admin/test时,它返回以下 JSON{ "Message":"没有找到与请求 URI 'http://test.com/admin/test'匹配的 HTTP 资源。", "MessageDetail":"找不到与名为 'admin' 的控制器匹配的类型。" }
有谁知道让路由使用基本控制器的属性的方法?
【问题讨论】:
-
我正在尝试完成完全相同的事情 - 使用基本 api 控制器来处理 CRUD - 我很惊讶它并不常见。这是我第一次看到有人提到尝试这样做,而我现在陷入了路由继承问题。你能分享一下你最终做了什么吗?
-
我让基本控制器具有实现 CRUD 操作的受保护方法,然后当我创建一个新控制器时,我必须创建公共方法并让它调用受保护方法。这样,我可以将路由放在控制器中的方法上,而不是放在基本控制器中,而不必到处复制代码。我不喜欢它,但替代方法是不使用 Route 属性,由于各种原因,这在我的情况下不起作用。
-
感谢您的回复。我使用了类似的方法 - 只需调用 base.[Get|Post|Put|Delete]() 并传递参数。这并不理想,但我认为好处是对于不熟悉将自定义 CRUD 操作放在何处的代码的人来说更明显。您是否在网上找到任何其他讨论使用基本控制器处理 CRUD 操作的资源?我的搜索没有结果。
-
如果您希望他们向 AttributeRouting 添加继承,请为我打开的问题投票 - aspnetwebstack.codeplex.com/workitem/1688
标签: asp.net-web-api asp.net-web-api-routing