删除额外的正文参数或将 WebGetAttribute/WebInvokeAttribute 上的 BodyStyle 属性设置为 Wrapped

Posted

技术标签:

【中文标题】删除额外的正文参数或将 WebGetAttribute/WebInvokeAttribute 上的 BodyStyle 属性设置为 Wrapped【英文标题】:remove the extra body parameters or set the BodyStyle property on the WebGetAttribute/WebInvokeAttribute to Wrapped 【发布时间】:2020-02-18 11:28:37 【问题描述】:

我收到此错误消息,要求我添加 BodyStyle 属性,而我的 webinvoke 中已有该属性。

错误: 抛出异常:System.ServiceModel.Web.dll 中的“System.InvalidOperationException” 合约“IService1”的操作“ping”指定要序列化的多个请求主体参数,而无需任何包装器元素。最多一个 body 参数可以在没有包装元素的情况下被序列化。。 这是我的服务合同:

[OperationContract]
    [WebInvoke(Method = "GET",
        BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json,
        UriTemplate = "ping/pNo,cno",
        RequestFormat = WebMessageFormat.Json)]
    string ping(string pNo,string cno);

我在我的 c# 桌面应用程序中这样调用它:

    Greenlines.Service1Client service = new Greenlines.Service1Client();
            service.ping("1", "2");

我的 app.config ServiceModel 是:

<system.serviceModel>
<bindings>
  <webHttpBinding>
    <binding name="webHttpBindingWithJsonP" />
  </webHttpBinding>
</bindings> 
<client>
  <endpoint 
    address="http://192.168.100.116/WcfService/Service1.svc"
    binding="webHttpBinding" 
    bindingConfiguration="webHttpBindingWithJsonP"
    contract="Greenlines.IService1" 
    behaviorConfiguration="MyWebb"
    name="webHttpBindingWithJsonP" />
</client>
<behaviors>

<endpointBehaviors>

<behavior name="MyWebb">

<webHttp />

</behavior>

</endpointBehaviors>

</behaviors> 
</system.serviceModel>

附:服务在浏览器/邮递员以及 android 应用程序客户端中运行良好。

【问题讨论】:

【参考方案1】:

是的,我们已经在服务器端设置了配置。但是当我们通过客户端代理调用服务时,调用 Restful 服务和调用 SOAP 服务之间有一个共同点。也就是说,我们应该保持服务器端和客户端之间的服务契约一致。因此请考虑将以下代码段添加到客户端自动生成的服务合约中。Reference.cs.

[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetData", ReplyAction="http://tempuri.org/IService1/GetDataResponse")]
        [WebGet(UriTemplate = "ping/value1,value2", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
        string GetData(string value1, string value2);

如果问题仍然存在,请随时告诉我。

【讨论】:

以上是关于删除额外的正文参数或将 WebGetAttribute/WebInvokeAttribute 上的 BodyStyle 属性设置为 Wrapped的主要内容,如果未能解决你的问题,请参考以下文章

我应该通过 HTTP 标头或将正文作为 JSON 传递到 REST Api 吗?

从结构中删除字段或将它们隐藏在 JSON 响应中

如何从加载的商店 sencha touch 中删除额外参数

当 HTTP-POST 有 body 时,url 参数为空

DataTables添加额外的查询参数和删除columns等无用参数

如何删除正文周围的边距空间或清除默认 CSS 样式