带有WebAPI的Http Post导致“HttpOperationHandlerFactory无法确定输入参数......”

时间:2012-03-19 20:46:00

标签: web-services asp.net-web-api

我有一个接收多个参数的方法。带属性的方法签名如下所示:

[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
public int AddUser(string firstName, string lastName, string emailaddress) { // actions here }

但是,当我使用此方法时,我得到以下异常:

  

HttpOperationHandlerFactory无法确定输入   应与请求消息内容关联的参数   用于服务操作'启动'。如果操作没有预料到   请求消息中的内容使用HTTP GET方法   操作。否则,请确保一个输入参数具有它   IsContentParameter属性设置为“True”或是一种类型   可分配给以下之一:HttpContent,ObjectContent`1,

所以,我已经创建了一个要传入的自定义对象(如下所示)。

[DataContract]
public class UserToAdd {
    [DataMember] public string firstName { get; set; }
    [DataMember] public string lastName { get; set; }
    [DataMember] public string emailAddress { get; set; }
}

使用这个新签名:

[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
public int AddUser(UserToAdd user) { // actions here }

当我这样做时,我得到了404.我似乎无法获胜。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

如果要以声明方式创建路由,则可以。我必须这样做,因为我继承了一堆非平静的URI,由于向后兼容性的原因必须支持这些URI。我创建了自己的属性来描述URI,约束和HTTP方法。这实际上是WebInvoke / WebGet的替代品。我在启动时反思我的服务方法以发现路线并适当地调用MapHttpRoute()。我的每个路由都明确指定了控制器和操作。这种方法适用于RPC风格的API,但它需要相当多的繁重工作。好的部分是它使用方法保持路由的定义 - 这不是web api明确给你的东西。

因此虽然RPC风格是可能的,但它并不是惯用语。 Web API强烈偏向RESTful API,使用常规驱动的路由到服务和方法的映射 - 这样就可以注册非常通用的路由,其余的约定则完成。这在很大程度上避免了定义路线远离其相应行为的问题。如果可以,我可以转换为Web API的RESTful / convention方法,因为您正在对框架进行一些打击。