C# 使用WCF,REST和SOAP应该协调工作吗?

C# 使用WCF,REST和SOAP应该协调工作吗?,c#,wcf,rest,soap,C#,Wcf,Rest,Soap,REST只接受字符串 所以我要做的是制作一个字符串公开的契约,并将其转换为服务器端,然后将其传递给SOAP直接调用的方法。这很有效。(我可以从firefox调用REST) 但是现在,我无法公开我的SOAP OperationContract而不导致错误问题: Operation 'GetServices' of contract 'IServices' specifies multiple request body parameters to be serialized without any

REST只接受字符串

所以我要做的是制作一个字符串公开的契约,并将其转换为服务器端,然后将其传递给SOAP直接调用的方法。这很有效。(我可以从firefox调用REST)

但是现在,我无法公开我的SOAP OperationContract而不导致错误问题:

Operation 'GetServices' of contract 'IServices' specifies multiple request body parameters to be serialized without any wrapper elements. At most one body parameter can be serialized without wrapper elements. Either remove the extra body parameters or set the BodyStyle property on the WebGetAttribute/WebInvokeAttribute to Wrapped.
下面是我的3个公开方法只有当我隐藏第三个时,其余部分才能工作。删除我的SOAP连接。。(我相信它希望在第三种方法上设置REST,但由于未定义REST,因此无法理解它)

//REST
[经营合同]
[WebGet(UriTemplate=“GET/Services/{CostCentreNo}/{Filter}”)]
列出RestGetServices(stringcostcentreno、stringfilter);
//休息
[经营合同]
[WebGet(UriTemplate=“GET/ServiceDetails/{CostCentreNo}/{ServiceCode}/{Recurrency}”)]
列出RestGetServiceDetails(字符串CostCentreNo、字符串ServiceCode、字符串Recurtive);
//肥皂
[经营合同]
列出GetServices(Int32 CostCentreNo、Int32筛选器);
当然,我只能创建一个契约方法,它允许我调用SOAP或REST

REST只接受字符串

不,那不是真的。映射到URL模板的参数可以是任何基本类型。WCF将为您进行转换。如果您使用
WebInvoke
而不是
WebGet
,并且您将使用PUT或POST方法,那么您甚至可以在请求中传递整个可序列化对象

如中所述:

使用时,路径中的UriTemplate变量始终解析为字符串 WebGet或WebInvoke。只能将UriTemplate变量绑定到int, long等,当它们位于模板的查询部分时

这是取自答案(),粗体格式是我的

下面是一个REST和SOAP可访问方法的示例:

// REST AND SOAP
[OperationContract]
[WebGet(UriTemplate = "/Services?CostCentreNo={CostCentreNo}&Filter={Filter}")]
List<Services> GetServices(Int32 CostCentreNo, Int32 Filter);
//REST和SOAP
[经营合同]
[WebGet(UriTemplate=“/Services?CostCentreNo={CostCentreNo}&Filter={Filter}”)]
列出GetServices(Int32 CostCentreNo、Int32筛选器);
可以通过


http://localhost:1337/WCF.IService.svc/rest/Services?CostCentreNo=1&Filter=1

唯一的问题是它没有遵循RESTful URL的正常约定。像angular resource这样的服务依赖于基本URL,比如
/item/:id
,然后只有HTTP方法会改变。如果您有一个不变的基本url,如
item?id=:id
WCF现在会抱怨WebGet/WebInvoke方法不能仅通过查询参数改变其uritemplate。最后定义
items?page=:pageNum&count=:count
item?id=:id
。我们不再有一个通用的URL来标识我们正在使用的资源或资源类型。
// REST AND SOAP
[OperationContract]
[WebGet(UriTemplate = "/Services?CostCentreNo={CostCentreNo}&Filter={Filter}")]
List<Services> GetServices(Int32 CostCentreNo, Int32 Filter);