我有合同:
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml, UriTemplate = "GetCategoriesGET/{userIdArg}", BodyStyle = WebMessageBodyStyle.Bare)]
List<Video> GetVideosGET(string userIdArg);
[WebInvoke(Method = "POST", UriTemplate = "evals")]
[OperationContract]
void SubmitVideoPOST(Video videoArg, string userId);
我有实施方法:
public List<Video> GetVideosGET(string userIdArg)
{
List<Video> catsToReturn = new List<Video>();
if (Int32.Parse(userIdArg) == 1)
{
catsToReturn = catsForUser1;
}
else if (Int32.Parse(userIdArg) == 2)
{
catsToReturn = catsForUser2;
}
return catsToReturn;
}
public void SubmitVideoPOST(Video videoArg, string userId)
{
}
当我浏览到:
http://localhost:52587/Api/Content/VLSContentService.svc/GetCategoriesGET/1
我收到此错误:
>'/'应用程序中的服务器错误。 操作'SubmitVideoPOST'的 合同'IVLSContentService' 指定多个请求正文 要进行序列化的参数 任何包装元素。最多一个身体 参数可以没有序列化 包装元素。要么删除 额外的身体参数或设置 BodyStyle属性 WebGetAttribute / WebInvokeAttribute为 缠绕。
当我添加POST的新方法(我还没有尝试访问)时,我才开始在Get请求中收到此错误,这是什么意思?我不能使用多个参数吗?
答案 0 :(得分:18)
看看这张海报提出同样问题的link。
相关部分是:
WCF doesn't support more than one parameter with bare body,
if you need pass several parameters in one post method operation,
then we need set the BodyStyle to Wrapped.
因此,在您的情况下,您必须将操作合同更改为以下内容:
[WebInvoke(Method = "POST", UriTemplate = "evals", BodyStyle = WebMessageBodyStyle.WrappedRequest)]
[OperationContract]
void SubmitVideoPOST(Video videoArg, string userId);
答案 1 :(得分:6)
XML不会有一个带有两个参数的根节点,这会导致它不正确。要引入单个根节点,必须按照错误说明,“包装”它。这使得该方法期望围绕两个数据的包装元素
将BodyStyle = WebMessageBodyStyle.Wrap添加到WebInvoke属性
答案 2 :(得分:3)
您是否尝试将WebGetAttribute / WebInvokeAttribute上的BodyStyle属性设置为Wrapped,如同建议的错误,如下所示:
[WebInvoke(Method = "POST", UriTemplate = "evals", BodyStyle = WebMessageBodyStyle.Wrapped)]
[OperationContract]
void SubmitVideoPOST(Video videoArg, string userId);
答案 3 :(得分:1)
我自己对WCF REST有些新意,上周刚刚完成了我的第一次服务。但我有类似的问题。 This article让我朝着正确的方向前进。包装器是我的问题。