使用来自外部程序集的类的 WCF 数据协定

Posted

技术标签:

【中文标题】使用来自外部程序集的类的 WCF 数据协定【英文标题】:WCF Data Contracts using class from external assembly 【发布时间】:2019-07-08 23:52:41 【问题描述】:
using System.IO;
using System.Runtime.Serialization;
using System.Xml;
using MR.Storage.CommonClasses;

namespace Storage.Contract


[DataContract]
public class SaveMyData


    [DataMember]
    public MR.Storage.CommonClasses.MyData MyData get; set; 

以上是我的 wcf 服务的数据协定类。 MyData 是使用 [DataContract] 和 [DataMember] 属性修饰的外部程序集中的 poco 类。当我在解决方案中添加对它的服务引用时,我得到“元数据包含无法解析的引用”。 我还尝试在 wcf 测试客户端中添加它,它会引发错误 ...\Test Client Projects\14.0\729f94f0-f564-4439-90f9-1c1553821666\Client.cs(42,26) : error CS0234: The type or namespace name命名空间“MR.Storage.CommonClasses”中不存在“MyData”(您是否缺少程序集引用?)我打开了这个文件,唯一的 using 语句是 using System.Runtime.Serialization;我在做什么不可能吗?我看到了一些关于使用代理的其他建议,但是 MyData 有很多字段,所以真的很想找到一个不涉及映射每个属性的解决方案

【问题讨论】:

您是否添加了对包含 MyData 类型的程序集的引用?一个普通的引用,不是服务引用。 是的,我的数据合约使用了 MR.Storage.CommonClasses;它引用了定义 MyData 的外部程序集 using 语句对链接该程序集没有任何作用。在解决方案资源管理器中,在您的项目节点下,在子节点引用中,是否有带有 MyData 类的程序集条目? 是的,有一个条目 【参考方案1】:

您是否编辑了 WCF 服务引用属性?您可以通过这种方式暗示外部程序集。老实说,我发现这种方法很麻烦(版本地狱问题),但是 YMMV。

【讨论】:

我没有编辑设置。外部对象曾经是内部的,因此它不能要求客户端更新他们的服务引用【参考方案2】:

如果你不一定要使用DataContractSerializer,你可以考虑使用XmlSerializer来序列化你的数据,它不需要使用DataContract和DataMember属性。

namespace ServiceInterface.Models

public class MyData

    public int Id  get; set; 
    public string Name  get; set; 
    public int Age  get; set; 


public  class MyDataFather

    public MyData MyData  get; set; 


我的服务合同和服务。请不要忘记将 XmlSerializerFormat 属性添加到您的服务合同中,它告诉 wcf 使用 XmlSerializer

[ServiceContract]
[XmlSerializerFormat]
public interface ICotractWithoutAttribute

    [OperationContract]
MyDataFather GetData(MyDataFather myDataFather);


public class CotractWithoutAttribute : ICotractWithoutAttribute

    public MyDataFather GetData(MyDataFather myDataFather)
    
        return myDataFather;
    

结果。

我的客户。

using (ChannelFactory<ICotractWithoutAttribute> factory = new ChannelFactory<ICotractWithoutAttribute>("without"))
        
            ICotractWithoutAttribute cotractWithoutAttribute = factory.CreateChannel();
            ServiceInterface.Models.MyDataFather myDataFather = cotractWithoutAttribute.GetData(new ServiceInterface.Models.MyDataFather  MyData = new ServiceInterface.Models.MyData  Name = "MICK", Age = 18, Id = 1  );
        

有关XmlSerializer的更多信息,您可以参考https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-the-xmlserializer-class

如果一定要使用 DataContractSerializer ,我认为你应该定义一个与外部类结构相似的类,将 DataContarct 和 DataMember 添加到类中,并将你的外部类的数据复制到你自己的服务类中。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/51b9d122-7345-44c7-8cd8-eb0ccdbffabf/can-i-use-external-assembly-class-in-a-wcf-without-using-poco?forum=wcf

【讨论】:

以上是关于使用来自外部程序集的类的 WCF 数据协定的主要内容,如果未能解决你的问题,请参考以下文章

使用来自另一个 MEF 程序集的类而不引用它

通过 WCF 调用传递继承的“数据协定”?

C# .NET 中挥之不去的程序集依赖项

部分隐藏外部程序集的接口方法

C#中的命名空间和程序集

是否有 Django 字段集的类选项的文档?