3

嗨,StackOverflowers 同事,

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

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

合约“IPublic”的操作“GetStopNames”指定了多个要序列化的请求主体参数,而无需任何包装器元素。最多一个 body 参数可以在没有包装元素的情况下被序列化。删除额外的正文参数或将 WebGetAttribute/WebInvokeAttribute 上的 BodyStyle 属性设置为 Wrapped。

我用谷歌搜索并搜索了 StackOverflow 多年,但似乎每个人都通过设置 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中相关位的摘录

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

我最终切换到使用 WebApi,但我一直保持这个问题开放,因为我仍然不确定它为什么会失败。

4

2 回答 2

0

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

uri = "GetStopNames/{p1}/{p2}?param1={p3}" 或 GetStopNames?param1={p1}¶m2={p2}¶m1={p3} 或任何组合

您不能通过添加服务引用来生成休息代理。您是否也有具有相同界面的基于肥皂的服务?

于 2013-07-26T00:53:37.143 回答
0
     [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"

于 2013-07-23T08:09:00.473 回答