0

我对肥皂标题的工作不多,所以我希望这里有答案。这是我想要完成的一个简单示例。

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

[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属性,而不是生成的类型。我的观点是,这是一种可怕的做事方式,但它可能是这些选项中最便宜的。我不打算做这个选项,但我只是想把它放在那里,因为从技术上讲它会起作用。

我错过了什么吗?这样做是否有公认的模式?

谢谢您的帮助。

4

1 回答 1

2

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

WCF 确实支持这一点。

于 2010-12-06T20:13:21.640 回答