我想为一个应用程序编写一个高级设计文档,该文档将为各种客户端公开它的Web服务。为此,我需要提供将在服务器端开发的Web服务的WSDL。我之前使用过Web服务,但从未深入研究过WSDL的细节。
我搜索了很多,发现我需要使用XML和XSD生成WSDL。好吧,我还没有设计两者,我认为这将是我的第一步。
现在我关注的是,使用原始XML非常困难,而且我不是WSDL术语的主人。
任何人都可以建议创建一个包含故障信息的简单WSDL应该执行哪些高级步骤?
任何见解都会有所帮助。
谢谢你们。
答案 0 :(得分:0)
使用WCF为您创建WSDL可能更容易。您只需要定义OperationContracts和DataContracts。您不必实现操作,只需定义它们在接口中的内容即可。
答案 1 :(得分:0)
实际上,如果您要遵循合同首次开发,则应首先生成“消息”。
在传统的Web服务中,您实际上会从XSD开始,以满足您的请求和响应。然后从XSD生成代码以保证您的数据类型符合SOAP。幸运的是,DataContractSerializer已变得非常智能,并将为您处理数据类型。
考虑到这一点,您应首先生成服务合同和请求/响应消息(数据合同)。在WCF中公开mex端点时,将为您生成WSDL。创建自己的WSDL可能非常复杂,如果您确实想隐藏某些消费者的功能,那么您应该尝试它的唯一原因。即使您因为这个原因想要生成自己的WSDL,如果为您生成WCF仍然会更容易,然后根据您的需要更改它。
让我们到此为止,看看你是否还有其他问题。
答案 2 :(得分:0)
我对契约优先Web服务的动机是允许不同开发人员并行编写服务和客户端。使用WSDL和“添加服务引用”,您必须在编写客户端之前发布服务。
作为替代方案,请不要通过WSDL。您可以编写一个由客户端和服务共享的.NET接口。该类将直接从接口生成WCF代理:
public interface IServiceClientFactory<TServiceInterface>
{
void CallService(Action<TServiceInterface> action);
TResult CallService<TResult>(Func<TServiceInterface, TResult> function);
}
public class ServiceClientFactory<TServiceInterface> :
IServiceClientFactory<TServiceInterface>
where TServiceInterface : class
{
class Client : System.ServiceModel.ClientBase<TServiceInterface>
{
public TServiceInterface Service
{
get { return base.Channel; }
}
}
public void CallService(Action<TServiceInterface> action)
{
Client client = new Client();
try
{
action(client.Service);
client.Close();
}
catch (Exception)
{
client.Abort();
throw;
}
}
public TResult CallService<TResult>(Func<TServiceInterface, TResult> function)
{
Client client = new Client();
try
{
TResult result = function(client.Service);
client.Close();
return result;
}
catch (Exception)
{
client.Abort();
throw;
}
}
}
Adventures in Software的更多详情。