代码之家  ›  专栏  ›  技术社区  ›  Aakash

帮助:合同优先的Web服务

  •  0
  • Aakash  · 技术社区  · 16 年前

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

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

    现在我关心的是,使用原始XML非常困难,而且我不精通WSDL术语。

    有人能建议应该执行哪些高级步骤来创建一个包含一些错误信息的简单WSDL吗?

    任何见解都会有所帮助。

    谢谢大家。

    3 回复  |  直到 16 年前
        1
  •  0
  •   Vadim Rybak    16 年前

    仅仅使用wcf为您创建WSDL可能更容易。您只需要定义操作合同和数据合同。您不必实现这些操作,只需定义它们在接口中的内容。

        2
  •  0
  •   CkH    16 年前

    实际上,如果您遵循契约优先开发,那么应该首先生成“消息”。

    在经典的Web服务中,您实际上可以从用于请求和响应的XSD开始。然后从XSD生成代码,以确保您的数据类型符合SOAP。幸运的是,DataContractSerializer变得非常智能,它将为您处理数据类型。

    考虑到这一点,您应该首先生成服务契约和请求/响应消息(数据契约)。在WCF中公开MEX端点时,将为您生成WSDL。创建您自己的WSDL可能非常复杂,实际上您应该尝试它的唯一原因是,如果您真的想对某些消费者隐藏功能。即使您出于这个原因想要生成自己的WSDL,让WCF为您创建if,然后根据您认为合适的方式对其进行更改仍然比较容易。

    我们到此为止,看看你还有什么问题要问。

        3
  •  0
  •   Michael L Perry    16 年前

    我之所以选择契约优先的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 .

    推荐文章