Web services 带有WebAPI的Http Post导致;HttpOperationHandlerFactory无法确定输入参数…”;

Web services 带有WebAPI的Http Post导致;HttpOperationHandlerFactory无法确定输入参数…”;,web-services,asp.net-web-api,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 } 但是,当我使用此方法时,会出现以下异

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

[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。看来我赢不了。有什么建议吗?

如果您想以声明方式创建路由,您可以。我必须这样做,因为我继承了一堆非restful URI,出于向后兼容性的原因,这些URI必须得到支持。我创建了自己的属性来描述URI、约束和HTTP方法。这实际上是WebInvoke/WebGet的替代品。我在启动时反思我的服务方法,以发现路由,并根据需要调用MapHttpRoute()。我的每个路由都明确指定控制器和操作。这种方法适用于RPC样式的API,但它需要相当多的繁重工作。很好的一点是,它使用方法保留了路由的定义——这不是web api显式提供给您的


所以,虽然RPC风格是可能的,但它不是惯用的。Web API强烈倾向于使用RESTful API,使用约定驱动的路由到服务和方法的映射-通过这种方式注册非常通用的路由,约定完成其余工作。这在很大程度上避免了从相应的操作中定义路由的问题。如果可以的话,我会转换为Web API的RESTful/convention方法,因为您在其他方面与框架有点冲突。

请确认,您知道ASP.NET Web API中不再支持HttpOperationHandler和WebInvoke吗?OperationHandler被ActionFilters取代,WebInvoke被MVC路由取代。也许这就是我的问题。伟大的我想我现在要改信仰了。谢谢因此,如果我以编程方式为注入创建ServiceRoute,我将不再使用HttpServiceHostFactory?问题是,我的最终目标是在Orchard CMS中获得REST约定,该约定已经以旧的MVC3方式处理路由。有一个单独的接口用于处理路由。我想我知道了一些事情,如果很快解决了,我会发回。显然,Orchard处理路由的方式和WebAPI预览6之间似乎存在问题。但我不确定该怪谁。