WCF 客户端中传递的多个参数不起作用(即使包装了 WebMessageBodyStyle)

Posted

技术标签:

【中文标题】WCF 客户端中传递的多个参数不起作用(即使包装了 WebMessageBodyStyle)【英文标题】:Multiple parameters passed in WCF client don't work (even when WebMessageBodyStyle is Wrapped) 【发布时间】:2012-09-30 00:52:59 【问题描述】:

大家好,***ers,

我有一个用 C# 编写的 WCF 服务,我可以成功地从 jquery 之类的东西中使用它。

我希望能够通过在 C# 中添加 Web 服务引用并在代码中进行调用来使用它。一切都很顺利,直到我添加了多个参数。当我尝试调用 any 服务方法时,我收到此错误:

合约“IPublic”的操作“GetStopNames”指定多个 请求正文参数在没有任何包装元素的情况下进行序列化。 最多一个 body 参数可以在没有包装元素的情况下被序列化。 删除额外的正文参数或设置 BodyStyle 属性 对 WebGetAttribute/WebInvokeAttribute 进行 Wrapped。

我在 *** 上搜索了很久,但似乎每个人都通过设置解决了他们的问题 BodyStyle=WebMessageBodyStyle.Wrapped 在 WebGet / WebInvoke 属性中。

接口中我的一种服务方法的示例:

    [OperationContract]
    [WebGet( BodyStyle=WebMessageBodyStyle.WrappedRequest
     , UriTemplate = "GetOperators?appKey=apk"
     , RequestFormat = WebMessageFormat.Json
     , ResponseFormat = WebMessageFormat.Json)]
    ResultList GetOperators(string apk);

这有什么问题吗?

我只是在打电话

ServiceReference1.PublicClient c = new ServiceReference1.PublicClient();
c.GetOperators("XXX");

在客户端内部,它在第二行中断。

有什么想法吗?如果您需要更多数据来帮助回答我,请添加评论:)

编辑: 这是我的 Web.config 文件中相关位的摘录 http://pastebin.com/CyQNG6wk

编辑: 我在 cmets 中链接的 serviceContract 的快捷方式 http://pastebin.com/bvGmGtfd

我最终改用了 WebApi,但我一直未解决这个问题,因为我仍然不确定它为什么会失败。

【问题讨论】:

可以发一下Operation 'GetStopNames' of contract 'IPublic'的定义吗? 真的没有意义。它真的很长,类似于 'public ResultList GetStopNames(string apk, string p) ....很多东西...返回一些 ResultList(); ' 该操作是否也用[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)]装饰? 我不确定我是否关注你。你的意思是在 .svc.cs 文件里面?如果是这样,没有。我假设由于 [ServiceContract] 接口充当接口并指定它,因此我不必这样做。 (我刚刚测试并添加它给我一个(405)错误 我问的是接口中方法的定义。你能发布你的整个 [ServiceContract] 界面吗?不是实现,只有接口。 【参考方案1】:
     [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "GetOperators?appKey=apk",
     BodyStyle =  WebMessageBodyStyle.Wrapped,
     ResponseFormat = WebMessageFormat.Json,RequestFormat=WebMessageFormat.Json)]
     ResultList GetOperators(string apk);

在 .svc 文件中确保 Service="Developer_Portal.Public"

【讨论】:

【参考方案2】:

这是 GetStopNames 中的问题。我假设它是 Http Get (WebGet)。确保它接受的所有参数都在 uri 模板中定义 GetStopNames(字符串 p1, 字符串 p2, 字符串 p3)

uri = "GetStopNames/p1/p2?param1=p3" 或 GetStopNames?param1=p1&param2=p2&param1=p3 或任何组合

您无法通过添加服务引用来生成 rest 代理。你们也有相同界面的基于肥皂的服务吗?

【讨论】:

以上是关于WCF 客户端中传递的多个参数不起作用(即使包装了 WebMessageBodyStyle)的主要内容,如果未能解决你的问题,请参考以下文章

多个保护级别在 WCF 中不起作用

WCF 服务证书和客户端端点身份 - 为啥它不起作用?

使用在端点上设置了标识的 WCF:正确的 UPN 不起作用

如何在 WCF Rest Service 中传递多个参数?

WCF 配置/身份验证在 Azure 中不起作用

WCF 休息 | URL 参数不起作用 GetProduct/productid/format