9

我有一个 wsdl 文件,它以一种非常无用的方式构建。它很大,在某些情况下有几兆字节,当我使用各种 Visual Studio 工具从中生成包装器时,生成的代码库非常大,以至于它往往会在较弱的机器上使 Visual Studio 崩溃。编译时间很可笑,并且生成的类使用了绝对需要更动态的访问模式的属性(即某种索引器)。服务器端没有任何更改的选项。

wsdl 文件比手工处理的要大得多,而且它们的数量是任意的。到目前为止,我采用的解决方案是对生成的自动生成的类使用反射或后期绑定。但是,由于我在这里处理的是一个包装器,它包装了基本上是 SOAP 消息客户端的东西,如果有另一种方法,那将是有意义的。

本质上,我想创建一个包装器,它公开一个更动态的界面,尤其是在涉及字段的地方。该任务并不完全简单,因此我正在寻找有关做什么的建议,以及各种类、可定制的代码生成器、WSDL 浏览器/解析器等,这将减少任务的耗时。我应该构建自己的 SOAP 客户端吗?我会以什么为依据?哪些 .NET 功能可以帮助我完成这项任务?

4

2 回答 2

9

您可以手工制作一个支持 WebService 上可用方法子集的接口,而无需生成服务引用。

您必须为包括 dto 和命名空间在内的方法创建正确的肥皂签名。这样做的缺点是您将被迫手动管理对服务的任何更改。

这是一个简单的示例,它显示了一个代理客户端,它ISubsetInterface通过与公开IServiceInterface. 为此,Name 属性必须与 IServiceInterface 协定的名称相匹配,在这种情况下默认为“IServiceInterface”,但您的实现可能需要对命名空间和操作进行操作。了解您需要操作什么的最简单方法是查看生成的 wsdl。

[TestFixture]
public class When_using_a_subset_of_a_WCF_interface
{
    [Test]
    public void Should_call_interesting_method()
    {
        var serviceHost = new ServiceHost(typeof(Service));

        serviceHost.AddServiceEndpoint( typeof(IServiceInterface), new BasicHttpBinding(), "http://localhost:8081/Service" );
        serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true;

        serviceHost.Open();

        using( var channelFactory = new ChannelFactory<ISubsetInterface>( new BasicHttpBinding(), "http://localhost:8081/Service") )
        {
            var client = channelFactory.CreateChannel();

            client.InterestingMethod().Should().Be( "foo" );
        }

        serviceHost.Close();
    }

    [ServiceContract]
    interface IServiceInterface
    {
        [OperationContract]
        string InterestingMethod();
        [OperationContract]
        string UninterestingMethod();
    }

    [ServiceContract(Name = "IServiceInterface")]
    interface ISubsetInterface
    {
        [OperationContract]
        string InterestingMethod();
    }

    class Service : IServiceInterface
    {
        public string InterestingMethod() { return "foo"; }

        public string UninterestingMethod() { throw new NotImplementedException(); }
    }
}
于 2012-06-19T22:33:51.967 回答
2

我建议使用包含DataContracts.

然后使用ChannelFactory<T>该类创建服务器接口的实例。然后,您可以在没有任何 WSDL 的情况下调用服务器。

于 2012-06-19T18:04:42.043 回答