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¶m2=p2¶m1=p3 或任何组合
您无法通过添加服务引用来生成 rest 代理。你们也有相同界面的基于肥皂的服务吗?
【讨论】:
以上是关于WCF 客户端中传递的多个参数不起作用(即使包装了 WebMessageBodyStyle)的主要内容,如果未能解决你的问题,请参考以下文章