2010-12-05 23 views
0

我没有使用肥皂标题,所以我希望这里有一个答案。这是我想要完成的一个简单例子。ASMX使用编译的类型而不是SoapHeader的生成类型

我有一个ASMX Web服务和一个客户端,以及一个共享的DLL。在shared.dll中,我有一个可序列化的类型,我们称它为CustomHeader,从SoapHeader派生。有接受这是通过SOAPHEADER属性输入一个Web方法,所以我的服务看起来像:

[WebService] 
public class MyService : WebService { 
    public CustomHeader MyCustomHeader { get; set; } 

    [WebMethod] 
    [SoapHeader("MyCustomHeader", Direction = SoapHeaderDirection.In)] 
    public void Go() { } 
} 

到目前为止,一切都很好。在Go()方法内部,我可以访问MyCustomHeader对象并使用它。从客户端生成代理时,生成的代码包括一个CustomHeader类,该类包含MyService对象的数据属性以及一个名为CustomHeaderValue的属性,我可以在对Go()进行服务调用之前在客户端上设置该属性,以及它通过它很好。

问题是原始的CustomHeader类有帮助填充数据字段(哈希函数,计算值等)的构造函数和方法。由于客户端具有对共享库的引用,客户端可以创建原始CustomHeader类的实例,但不能在服务调用中使用该对象,因为它在技术上是不同的类型。

我能想到的处理这几种方法:

1)在同一时间超过一个拉动性转换的CustomHeader对象生成的CustomHeader类。这不会有太多的处理,但这意味着我需要使用反射来遍历属性,或者在CustomHeader类更改时触摸转换代码。

2)序列化CustomHeader对象,然后将其反序列化到生成的CustomHeader类中 - 因为除了构造函数和方法外,它们真的是相同的,所以序列化应该很好。这将是最简单的方法,但它需要额外的一轮序列化/反序列化,虽然不是非常昂贵,但仍然是额外的处理。

3)修改生成的代码,使我的共享类型的CustomHeaderValue属性,而不是生成的类型。我认为这是一种可怕的做事方式,但它可能是这些选项中最便宜的方式。我不打算做这个选择,但我只是想把它放在那里,因为从技术上讲它会起作用。

我错过了什么吗?有没有一个可以接受的模式?

感谢您的帮助。

回答

2

ASMX Web服务不支持在客户端和服务之间重用类型。

WCF支持这一点。

+0

谢谢。我感觉如果没有升级到WCF或者执行上面列出的解决方案之一,我不会做到这一点。我将使用上面的#2解决方案,序列化和反序列化对象,将其转换为适当的类型。 – 2010-12-07 00:12:48

相关问题