gpt4 book ai didi

c# - 使用不同的界面使用 Web 服务

转载 作者:太空狗 更新时间:2023-10-29 17:46:52 25 4
gpt4 key购买 nike

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

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

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

最佳答案

您可以手工设计一个接口(interface)来支持 WebService 上可用方法的子集,并消除生成服务引用的需要。

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

这是一个简单的示例,显示了使用 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(); }
}
}

关于c# - 使用不同的界面使用 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11102353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com