给出以下服务定义:
public class RuleEngineServices : Service
{
public object Any(ExecuteRule request)
{
var response = new ExecuteRuleResponse();
return response;
}
}
如何影响在visual studio中添加“Web服务引用”生成的代理名称?如果我将Web引用命名为“RuleEngineWS”,则会创建以下签名:
using (var client = new RuleEngineWS.SyncReply())
{
ExecuteRule request = new ExecuteRule(); //request DTO
ExecuteRuleResponse response = client.ExecuteRule(request);
}
请求DTO和方法都具有相同的名称,使得所述服务的消费者感到困惑。有没有办法从dtos中明确划分方法?
谢谢你, 斯蒂芬
答案 0 :(得分:3)
无法通过Visual Studio"添加服务参考"来修改代码的生成方式。其他复制和手动修改生成的WSDL,并让用户从您修改的WSDL生成服务引用。但是你需要小心,不要改变发送的SOAP消息的有线格式。
但SOAP是一个极其脆弱,臃肿且严格的协议,对于Service Interop而言many attributes that make it a poor choice,尽管在将来支持.NET Core的ServiceStack版本中不太可能提供它。
您的关注点应该是让您的服务使用者使用卓越的开发工作流程,如Add ServiceStack Reference所示,它更干净,更快速,更具弹性,具有更多功能,并提供理想的类型客户端API和更高的HTTP保真度幕后工作只是在optimal Format of your ServiceClient中发送干净的DTO,而不会产生将消息嵌入SOAP信封的开销和运行时问题。
今天使用SOAP的原因应该很少,因为消费服务没有提供超过HTTP的固有优势,我认为今天需要使用它的唯一正当理由是你的消费者正在使用只允许连接的企业工具到SOAP端点。
如果出于某种原因,您的消费者被要求使用SOAP,他们可以使用仍然使用通用WCF客户端进行基础SOAP消息交换的Soap12ServiceClient
,但可以获得更好,更一致的API。如果你没有在客户端上创建一个瘦门面,那么隐藏生成的API会隐藏在你喜欢的理想API名称后面,例如:
var client = new RuleEngineClient(new RuleEngineWS.SyncReply());
var response = client.Send(new ExecuteRule { ... });
和幕后调用适当的SyncReply.ExecuteRule()
方法。