2016-04-25 101 views
2

我正在使用具有各种方法的Web服务,其中之一需要xml作为输入。肥皂服务方法类定义c#

有一个结构需要传递以获得正确的响应。

我已经在Visual Studio中添加了服务引用,并且可以在它生成的合同类中看到该方法。

如何创建正确的类,而无需获取.xsd文件并运行xsd.exe来生成类?由于未来可能会更改为xml格式,因此我需要再次运行xsd.exe,这并不好。

任何想法将是巨大的

感谢

+0

你有访问网络服务组件?特别是包含服务定义的程序集? –

+0

Web服务需要一个类还是文本?如果它只是文本,那么你所需要做的就是读取xml文件并以文本形式发送。一个序列化的类将产生与文本xml文件相同的xml文件,所以将序列化xml文件(创建类)仅仅用于序列化(创建文本)相同的文本是否有意义? – jdweng

回答

1

由于有可能在未来的XML格式的变化,那么我会 需要再次运行XSD.EXE这是不好的。

您完全正确的是,生成服务合约定义的客户端表示形式并不好。最好引用服务程序集中的实际服务定义,然后在运行时使用ChannelFactory<T>构建您的通道。由于许多原因,这比使用生成的服务引用要优越得多。

只有两件事情可以在您的方式站在这个方法:

  1. 您没有访问该服务的二进制文件。观察你必须能够使用用于定义服务的实际类型。
  2. 服务二进制文件可用,但被编译为一个“超级程序集”,其中包含各种您不关心的东西,不一定要从您的客户端应用程序中使用。

如果第一上述两个条件为真,那么抱歉,但必须使用XSD.EXE求助于生成的客户端代理,并接受所有惩罚,这incurrs。如果第二个条件成立,您可能会要求服务所有者将服务定义代码提取到单独的程序集中,并且您可以使用所描述的方法正常进行。

我手边的类,所以可以使用XML序列化...做我只是创造一个 和的SoapEnvelope然后生成的XML追加到 请求的主体?

我假设服务也使用WCF?

使用像WCF这样的框架的一点是,您不需要关心从客户端到服务端的数据的序列化,编码和传输。 WCF为您处理所有这些事情。你所需要做的就是使用服务定义创建WCF通道(通常这是一个将服务操作定义为接口上的方法的接口)。

然后,您可以针对通道实例调用这些方法,并将请求序列化为XML,包装在SOAP包装器中,然后通过HTTP传输到请求已接收,解包和反序列化的服务任何努力。

这里有一个例子:https://stackoverflow.com/a/8869809/569662

+0

嗨,感谢您的回复。看起来他们会很灵活,因为我们需要向他们提供表示,所以我有手头的类,所以可以使用xml序列化器。但是使用xml请求调用服务,我只是创建一个soapEnvelope,然后将生成的xml附加到请求的主体? – tjhack

+0

@tjhack我已经更新了我的答案 –