【发布时间】:2012-05-15 09:02:32
【问题描述】:
在 WCF REST 中,我可以定义一个严格的 URL 模板。
在 ASP.NET MVC Web API 4 中我遇到了问题。
我正常注册了路线:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
我的控制器有这个方法:
// POST /api/documents
public HttpResponseMessage<Document> Post(Document document)
{...}
如果我使用此 URL“http://servername.com:53835/api/Documents/1337”发送 POST 请求(参数“1337”不应该存在),它调用 Post(Document 文档) 方法。但我希望框架在这种情况下显示错误。 (例如“未找到此请求的 API 调用”)。
使用 REST WCF,我可以严格配置它... 我对这种“约定优于配置”并不那么热情……
我该如何做更复杂的 URL 模板?
- 我想要这样的东西:
带有此 URL 模板的 GET-Request 的 API: “http://servername.com:53835/api/Documents/1337” 获取特定的文档对象(包含创建日期、创建者等元数据......)。
另一个 GET-Request 应该使用以下 URL 检索文件本身(作为流): http://servername.com:53835/api/Documents/1337/File
我如何定义这种差异? 获取文档对象的 GET 方法如下所示:
// GET /api/documents/5
public HttpResponseMessage<Document> Get(int id)
{...}
如何定义具有相同参数的单独方法(在本例中为“id”)?我是否必须使用 WCF REST-Projects 中的方法属性配置 URL 模板?
我可以像这样编辑 {action} 占位符的路由:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{mandant}/{controller}/{id}/{action}",
defaults: new { mandant = "profile", id = RouteParameter.Optional, action = RouteParameter .Optional}
);
然后我可以使用方法属性 [ActionName("File")] 和 [AcceptVerbs("GET")] 撒谎:
[ActionName("File")]
[AcceptVerbs("GET")]
public HttpResponseMessage FileDownload(int id)
然后我可以调用:“http://servername.com:53835/api/Documents/1337/File”来获取文件。 但是如果我想要更多这些“动作”呢?
- 更复杂的用例是包含重复部分的 URL。 类似的东西:(在这种情况下,我有一些项目特征。这个特征的数量应该是可变的)
http://servername.com:53835/api/Documents/characteristic_1/characteristic_2/characteristic_3 http://servername.com:53835/api/Documents/characteristic_1/characteristic_2
具有特征的部分应该是动态/可变的。
【问题讨论】:
标签: asp.net-mvc wcf templates url asp.net-web-api