0

我在 WCF 服务的 ServiceContract 中定义了一个函数,如下所示:

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/test")]
CommandResponse Test();

另一方面,在客户端应用程序中,我通过 Visual Studio 中的“添加服务引用”添加了 WCF 服务。使用以下方式调用服务测试功能时:

var test = m_ServiceClient.Test();

我收到一条错误消息:

Operation 'GetUser' of contract... specifies multiple request body parameters to be serialized ...

GetUser() 是我在服务合同中的另一个函数(也是一个 GET 函数,但在 UriTemplate 中有参数)。我的猜测是客户端正在使用它的参数调用该函数,但请求将转到错误的 UriTemplate (或者根本没有模板,它只是跳转到某种默认值)。

我必须遵循任何特殊说明来让客户了解 UriTemplates 功能?

我已经搜索了所有内容,但找不到可以帮助解决此问题的单个页面...

4

2 回答 2

2

当您公开您的服务时使用这些WebInvoke/WebGet属性,该服务WebHttpBinding用于以 REST 样式使用您的 WCF 服务。为了通过 SOAP 添加[OperationContract]属性访问方法并通过basicHttpBinding.

如果您想以 REST 样式访问服务,那么您应该使用HttpWebRequest类来创建您的请求,而不是添加Add Service Reference.

为了实现这两者,即通过 SOAP 和 REST 访问服务,只需添加属性[OperationContract]WebInvoke公开另一个端点元素basicHttpBinding

于 2012-08-07T08:40:57.477 回答
0

为了让客户端识别 UriTemplates 并以模板定义的格式将每个方法传递给它自己的 Url,我将 ServiceContract 接口复制到客户端,然后创建了一个到服务基础 url 的通道

WebChannelFactory<IServiceContract> cf = new WebChannelFactory<IServiceContract>(new Uri("http://...."));
var service = cf.CreateChannel();

生成的“服务”是直接与 Web 服务一起使用的可用接口。

于 2012-09-20T17:08:15.533 回答