Wcf 我的数据合同有什么问题?
我正在写我的第一个WCF服务。我试图理解数据契约是如何工作的。我已经阅读了描述如何标记自定义类型以创建数据协定的示例,但我无法让我的示例正常工作 我有一个简单的DTO对象,我把它放在一个共享库中,因为我想让客户机和服务了解这种类型(对吗?),它看起来像这样:Wcf 我的数据合同有什么问题?,wcf,datacontractserializer,datacontract,Wcf,Datacontractserializer,Datacontract,我正在写我的第一个WCF服务。我试图理解数据契约是如何工作的。我已经阅读了描述如何标记自定义类型以创建数据协定的示例,但我无法让我的示例正常工作 我有一个简单的DTO对象,我把它放在一个共享库中,因为我想让客户机和服务了解这种类型(对吗?),它看起来像这样: using System.Collections.Generic; using System.Runtime.Serialization; namespace org.healthwise.gatewayinterfaces.mock
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace org.healthwise.gatewayinterfaces.mocks
{
[DataContract]
public class MockCheckInDTO : ICheckInDTO
{
[DataMember]
private string _testPackageFilePath = "testpackages\\973eb455-6acc-486b-a1dd-2cf527872b1e.zip";
[DataMember]
private IDictionary<string, string> _testMetaData;
public MockCheckInDTO()
{
_testMetaData = MakeTestMetaDataDictionary();
}
private IDictionary<string, string> MakeTestMetaDataDictionary()
{
IDictionary<string, string> testMetaData = new Dictionary<string, string>();
testMetaData.Add("Version", "9.0.1");
testMetaData.Add("Product Family", "Learning Modules");
return testMetaData;
}
[DataMember]
public string PackageFileLocation
{
get { return _testPackageFilePath; }
set { _testPackageFilePath = value; }
}
[DataMember]
public IDictionary<string, string> PackageMetaData
{
get { return _testMetaData; }
set { _testMetaData = value; }
}
}
}
我创建了一个小控制台应用程序,试图将这个MockCheckInDTO发送到我的服务中,但它从未到达那里。似乎我正在对MockCheckInDTO对象进行序列化。有人能帮我吗
这是我看到的一个例外:
System.Runtime.Serialization.SerializationException:键入“org.healthwise.gatewayinterfaces.mocks.mockCheckInTo”,数据协定名称为“mockCheckInTo”:http://schemas.datacontract.org/2004/07/org.healthwise.gatewayinterfaces.mocks”他说。考虑使用DATACONTRORTCORDEVER或在已知类型列表中添加静态不知道的任何类型。
尝试从私有字段中删除
[DataMember]
,这样它就只在公共属性中。如果您仍然有问题,这可能有助于您了解DataContract的进展情况,而不是让DC位于共享库中,而是让它从服务元数据自动创建。然后看看它,看看它是否是你所期望的。如果没有,那么在尝试序列化/反序列化对象时,您至少可以了解出了什么问题。首先,您可以将相同的数据序列化两次:私有字段和公共属性。正如Tim S.所说,最好移除一个。
我试图直接使用DataContractSerializer重现您的问题,但失败了
DataContractSerializer serializer = new DataContractSerializer(typeof(MockCheckInDTO));
var data = new MockCheckInDTO();
using (var file = File.OpenWrite("dto.xml"))
using (var xmlWriter = XmlDictionaryWriter.CreateTextWriter(file))
{
serializer.WriteObject(xmlWriter, data);
}
using (var file = File.OpenRead("dto.xml"))
using (var xmlReader = XmlDictionaryReader.CreateTextReader(file, XmlDictionaryReaderQuotas.Max))
{
var result = serializer.ReadObject(xmlReader);
}
请您添加一些代码,说明如何调用
AddToIndex
?这是我的第一个WCF项目。我不知道这个svcutil.exe似乎是客户机“发现”数据契约的公认方法。
DataContractSerializer serializer = new DataContractSerializer(typeof(MockCheckInDTO));
var data = new MockCheckInDTO();
using (var file = File.OpenWrite("dto.xml"))
using (var xmlWriter = XmlDictionaryWriter.CreateTextWriter(file))
{
serializer.WriteObject(xmlWriter, data);
}
using (var file = File.OpenRead("dto.xml"))
using (var xmlReader = XmlDictionaryReader.CreateTextReader(file, XmlDictionaryReaderQuotas.Max))
{
var result = serializer.ReadObject(xmlReader);
}