2012-08-06 106 views
0

的后跟我已经定义我的WCF服务的ServiceContract一个功能合同UriTemplates:WCF客户端不遵循

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

而在另一端,在客户端应用程序,我通过添加WCF服务“添加服务参考“。当调用使用该服务的测试功能:

var test = m_ServiceClient.Test(); 

我收到一个错误说:

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

的的getUser()是其他功能我在服务合同(也GET功能,但与UriTemplate中的参数)。 我的猜测是,客户端正在调用函数的参数,因为它应该这样做,但是请求发送到了错误的UriTemplate(或者根本没有模板,它只是跳转到某种默认模式)。

为了让客户了解UriTemplates的功能,我必须遵循哪些特殊说明?

我搜索了全国各地,但没有找到一个单一的页面,这个问题可以帮助...

+0

当您通过WebHttpBinding公开您的服务时使用webInvoke属性,该服务用于使用REST风格的服务。为了通过SOAP访问方法,添加“OperationContract”属性并通过basicHttpBinding公开 – Rajesh 2012-08-07 08:37:30

回答

0

另一个端点元素对于客户端识别UriTemplates并在每个方法传递给它自己的网址通过我复制的ServiceContract接口客户机,然后模板中定义的格式创建了一个信道到服务基础URL

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

所得“服务”是一个可用的接口与web服务直接起作用。

2

当您通过WebHttpBinding这对于REST消费WCF服务暴露你的服务的WebInvoke/WebGet属性使用样式。为了通过SOAP访问该方法添加[OperationContract]属性并通过basicHttpBinding公开端点。

如果您希望以REST风格访问服务,那么您应该使用HttpWebRequest类来创建请求,而不是添加Add Service Reference

为了实现这两个即通过SOAP访问服务和REST只是添加[OperationContract]WebInvoke属性一起,并揭示basicHttpBinding

+0

我想通过REST访问服务。在函数中添加了[OperationContract],仍然得到相同的结果。当使用浏览器访问服务时,所有工作都正常,我的问题是只有Visual Studio自动生成的客户端代理。 – Idan 2012-08-07 12:12:44

+0

您是否在您的服务器配置文件中添加了使用SOAP公开您的WCF服务的端点元素 – Rajesh 2012-08-07 15:21:48

+0

我没有使用SOAP。我只使用REST。 – Idan 2012-08-08 08:00:10