勇哥注:
这个问题比较常见。它是在一个rest函数中,想使用多个参数,或者类似Tuple<>这样的复合类型,怎么弄?
一般的做法是使用查询字符串,或者是单个包装类型,例如类。
在WCF REST服务中,WebInvoke
或 WebGet
属性的 UriTemplate
参数不支持直接将 Tuple<string, int, int>
或任何复杂类型作为路径参数(即URL中的 {data}
部分)。UriTemplate
中的路径参数(如 {data}
)通常被期望为简单的类型,如字符串、整数等,这些类型可以直接从URL中解析出来。
当你尝试将 Tuple<string, int, int>
作为路径参数时,WCF 框架无法直接理解如何从URL中提取这样一个复杂类型,因为它期望的是一个简单的值。
要解决这个问题,你有几个选项:
使用查询字符串:
将Tuple
中的数据作为查询字符串参数传递,而不是路径参数。
[WebInvoke(Method = "DELETE", UriTemplate = "/Del?param1={param1}¶m2={param2}¶m3={param3}")] public void DeleteMethod(string param1, int param2, int param3) { // 实现删除逻辑 }
调用这个服务时,URL可能是这样的:/Del?param1=value1¶m2=123¶m3=456
使用单个包装类型:
如果你需要这些数据作为请求体的一部分(尽管你最初使用的是路径参数),你可以创建一个包装类型,并将其作为请求体传递。然而,这通常与DELETE
请求不符,因为DELETE
请求通常不包含请求体(尽管技术上可以,但不符合REST的最佳实践)。
public class DeleteRequest { public string Param1 { get; set; } public int Param2 { get; set; } public int Param3 { get; set; } } // 注意:通常不推荐在DELETE请求中包含请求体 [WebInvoke(Method = "DELETE", UriTemplate = "/Del", BodyStyle = WebMessageBodyStyle.Bare)] public void DeleteMethod(DeleteRequest request) { // 实现删除逻辑 }
但是,请注意,虽然你可以这样做,但将请求体用于 DELETE
请求并不是RESTful API设计的标准做法。
重新设计URL结构:
如果可能的话,重新设计你的URL结构,以便它只包含简单的路径参数或不需要额外参数的路径。
[WebInvoke(Method = "DELETE", UriTemplate = "/Del/{id}")] public void DeleteMethod(int id) { // 使用id来查找和删除相关记录 // 如果需要额外的参数,考虑从数据库或其他存储中检索它们 }
使用POST请求:
如果你的操作需要复杂的参数,并且这些参数不适合放在URL中,考虑使用 POST
请求而不是 DELETE
请求,并将这些参数放在请求体中。
[WebInvoke(Method = "POST", UriTemplate = "/Del", BodyStyle = WebMessageBodyStyle.Bare)] public void DeleteWithPost(DeleteRequest request) { // 实现删除逻辑 }
但是,请注意,使用 POST
请求进行删除操作可能不符合RESTful API的直觉性,因为 POST
通常用于创建新资源。在这种情况下,你可能需要仔细考虑你的API设计,以确保它符合你的业务逻辑和RESTful原则。
另注:
不支持类型指定,如:/Del/{id:int}
这些高级玩法只能使用asp.net mvc的webapi了。

