动态调用肥皂服务方法

时间:2018-07-18 10:02:19

标签: c# wsdl

我试图编写一些使用WSDL的C#(.NET Framework 4.7.1),然后返回Meta,方法签名以及WSDL中定义的任何复杂类型。然后可以使用此元数据来调用任何方法。我目前的想法是使用这两个命名空间。

using System.ServiceModel.Description;
using System.Web.Services.Description;

取决于它是较旧的.ASMX类型服务还是较新的WCF样式服务(具有绑定等)。类似于Visual Studio中的“添加Web引用”或“添加服务引用”。我生成C#代码,然后使用Roslyn编译为DLL。我使用反射获取元数据。发现这比对WSDL进行反向工程更容易。然后的想法是使用反射调用方法。

麻烦的是,对于WCF样式服务,我无法获取需要传递到客户端构造函数中的绑定信息

        System.Web.Services.Description.ServiceDescription serviceDescription = null;
        Uri address = new Uri(wsdl);
        var binding = new BasicHttpBinding();
        binding.MaxReceivedMessageSize = int.MaxValue;
        MetadataExchangeClient metadataExchangeClient = new MetadataExchangeClient(binding);
        metadataExchangeClient.ResolveMetadataReferences = true;

        MetadataSet ms = metadataExchangeClient.GetMetadata(address, MetadataExchangeClientMode.HttpGet);
        Collection<MetadataSection> documentCollection = ms.MetadataSections;

        if (documentCollection != null && documentCollection.Count > 0)
        {
            serviceDescription = (System.Web.Services.Description.ServiceDescription)documentCollection[0].Metadata;
        }

以上代码用于获取MetaSections,但这些是此命名空间System.Web.Services.Description中的ServiceDescriptions。然后包含绑定和操作等。但是我需要从此命名空间System.ServiceModel.Description进行绑定,以将其传递给此构造方法,以便随后可以调用方法

public Service1Client(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
        base(binding, remoteAddress) {
}

如果有人有任何指针,那将非常有帮助。谢谢

0 个答案:

没有答案