WCF数据使用外部程序集中的类进行合同

问题描述 投票:0回答:2
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是外部程序集中的poco类,使用[DataContract]和[DataMember]属性进行修饰。当我在解决方案中添加服务引用时,我得到“元数据包含无法解析的引用”。我也尝试在wcf测试客户端中添加它并抛出错误... \测试客户端项目\ 14.0 \ 729f94f0-f564-4439-90f9-1c1553821666 \ Client.cs(42,26):错误CS0234:类型或命名空间名称命名空间'MR.Storage.CommonClasses'中不存在'MyData'(你是否缺少程序集引用?)我打开了这个文件,唯一的using语句是使用System.Runtime.Serialization;我不能做什么?我看到了一些关于使用代理的其他建议,但MyData有很多字段,所以我真的想找到一个不涉及映射每个属性的解决方案

c# wcf datacontract
2个回答
1
投票

您是否编辑了WCF服务引用属性?您可以通过这种方式提及外部装配。说实话,我发现这种方法在屁股(版本地狱问题)中是一种痛苦,但是YMMV。


0
投票

如果您不一定使用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;
    }
}

结果。

enter image description here

我的客户。

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

© www.soinside.com 2019 - 2024. All rights reserved.