Wcf 帮助:合同优先Web服务

Wcf 帮助:合同优先Web服务,wcf,web-services,wsdl,Wcf,Web Services,Wsdl,我想为一个应用程序编写一个高级设计文档,它将为各种客户机公开它的Web服务。为此,我需要提供我们将来将在服务器端开发的Web服务的WSDL。我以前使用过web服务,但从未深入了解WSDL的细节 我搜索了很多,发现我需要使用XML和XSD生成WSDL。嗯,我还没有设计这两个,我想这将是我的第一步 现在我关心的是,使用原始XML非常困难,而且我不精通WSDL术语 有谁能建议一下,为了创建一个包含一些错误信息的简单WSDL,应该执行哪些高级步骤 任何见解都会有所帮助 谢谢大家。使用WCF为您创建WSD

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

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

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

有谁能建议一下,为了创建一个包含一些错误信息的简单WSDL,应该执行哪些高级步骤

任何见解都会有所帮助


谢谢大家。

使用WCF为您创建WSDL可能更容易。您只需要定义OperationContracts和DataContracts。您不必实现这些操作,只需定义接口中的操作即可

实际上,如果您遵循合同优先开发,您应该首先生成“消息”

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

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


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

我使用contract first 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;
        }
    }
}
公共接口IServiceClientFactory
{
无效呼叫服务(行动);
TResult CallService(Func函数);
}
公共类ServiceClientFactory:
伊瑟维克工厂
其中TServiceInterface:class
{
类客户端:System.ServiceModel.ClientBase
{
公共服务接口服务
{
获取{return base.Channel;}
}
}
公共无效呼叫服务(行动)
{
客户端=新客户端();
尝试
{
行动(客户服务);
client.Close();
}
捕获(例外)
{
client.Abort();
投掷;
}
}
公共TResult调用服务(Func函数)
{
客户端=新客户端();
尝试
{
TResult result=函数(client.Service);
client.Close();
返回结果;
}
捕获(例外)
{
client.Abort();
投掷;
}
}
}

更多详细信息,请访问。

为什么要创建自己的WSDL?我试图在这里获得动机,这样我可以在回答时为你指出正确的方向。自动生成的WSDL有什么问题?@Cameron,这是我第一次想创建WSDL。我想遵循合同优先的方法。在初始阶段,应用程序设计会有很多变化和更新。而我们的信息元素、操作也可能会改变。。因此,我认为首先创建WSDL而不进行任何编码是正确的。我说得对吗?谢谢你的回复,干杯!请看下面我的答案,我们将从那里开始工作。