[英]WCF Data Contracts using class from external assembly
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测试客户端中添加它,并抛出错误... \\ Test Client Projects \\ 14.0 \\ 729f94f0-f564-4439-90f9-1c1553821666 \\ Client.cs(42,26):错误CS0234:类型或名称空间名称命名空间“ MR.Storage.CommonClasses”中不存在“ MyData”(您是否缺少程序集引用?)我打开了该文件,唯一的using语句正在使用System.Runtime.Serialization。 我在做什么是不可能的吗? 我看到了有关使用代理的其他建议,但是MyData有大量字段,因此我真的很想找到一个不涉及映射每个属性的解决方案
您是否编辑了WCF服务参考属性? 您可以通过这种方式暗示外部程序集。 老实说,我发现这种方法对屁股(版本地狱问题)很痛苦,但对YMMV却很痛苦。
如果不必使用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/zh-cn/dotnet/framework/wcf/feature-details/using-the-xmlserializer-class
如果必须使用DataContractSerializer,我认为您应该使用与外部类相似的结构来定义一个类,将DataContarct和DataMember添加到该类中,然后将外部类的数据复制到服务中自己的类中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.