如何使多个wcf类库中的共享类型对所有客户端都相同

时间:2014-07-07 10:48:41

标签: c# wcf

让我解释一下我的问题:我有一个共享类型,我们称之为#34; SharedType"。 然后我使用该类型示例在多个名称空间下有多个wcf服务:Service1.SharedType,Service2.SharedType ...我可以在同一个xml名称空间和名称下序列化所有这些吗?我的每个客户都有一种名称" SharedType"和命名空间" www.datacontract.org"。我注意到第一个运行的服务遇到没问题我可以在respectif客户端上使用SharedType。当我开始第二个时,我不能在它上面使用那个类型&#39 ; s客户端,它告诉我类型不是预期的,我应该使用解析器...... 有没有办法强迫接受,我故意这样需要他们。 是的,我使用wcf类库而不是wcf应用程序。

谢谢你微笑| :)

1 个答案:

答案 0 :(得分:1)

解决此问题的方法是将共享类型放入dll中。然后在服务器项目中引用该DLL,然后引用客户端项目。只要您使用相同的DLL,您应该没问题。 (假设您在这里使用数据合同序列化器。)

以下是您如何做这类事情的示例。注意Person是如何在DLL中的。 https://github.com/Aelphaeis/MyWcfPipeExample

如果您正在使用双工,那么您可以查看此示例。没有复杂类型的同样的事情。 https://github.com/Aelphaeis/MyWcfDuplexPipeExample

解决此问题的另一种方法是实际获取对象并将其序列化为字符串并删除名称空间。将其传递给服务并手动反序列化。这是相当繁琐的,除非你不能使用数据合同序列化器并且你使用的是旧的Web服务(3.5中的.asmx),否则我不建议这样做。但是,如果你已经死定了这个疯狂的想法,你可以做到以下几点:

public class NoNameSpaceXmlWriter : XmlTextWriter
{
    public NoNameSpaceXmlWriter(TextWriter output) : base(output) { Formatting = Formatting.Indented; }
    public override void WriteStartDocument() { }
    public override void WriteStartElement(string prefix, string localName, string ns) { base.WriteStartElement("", localName, ""); }
}

,用法如下:

new XmlSerializer(ret.GetType()).Serialize(new NoNameSpaceXmlWriter(ms), ret);

其中ret是一些随机对象。