帮助:合同第一Web服务

时间:2010-07-06 16:15:37

标签: wcf web-services wsdl

我想为一个应用程序编写一个高级设计文档,该文档将为各种客户端公开它的Web服务。为此,我需要提供将在服务器端开发的Web服务的WSDL。我之前使用过Web服务,但从未深入研究过WSDL的细节。

我搜索了很多,发现我需要使用XML和XSD生成WSDL。好吧,我还没有设计两者,我认为这将是我的第一步。

现在我关注的是,使用原始XML非常困难,而且我不是WSDL术语的主人。

任何人都可以建议创建一个包含故障信息的简单WSDL应该执行哪些高级步骤?

任何见解都会有所帮助。

谢谢你们。

3 个答案:

答案 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的更多详情。