我有一个Windows服务和winform前端应用程序。我需要能够调用并传递数据往返于服务中的方法。我通过定义一个接口来实现这一点,并且可以毫无问题地传递字符串。
[ServiceContract]
public interface IStringReverser
{
[DataContractFormat]
[OperationContract]
string ReverseString(string value);
}
我现在正在尝试返回一个复杂的数据类型并修改了代码:
[ServiceContract]
public interface IStringReverser
{
[DataContractFormat]
[OperationContract]
DTO ReverseString(string value);
}
[Serializable]
public class DTO
{
public int Id { get; set; }
public string Name { get; set; }
}
我的实施是这样的:
public class StringReverser : IStringReverser
{
public DTO ReverseString(string value)
{
char[] retVal = value.ToCharArray();
int idx = 0;
for (int i = value.Length - 1; i >= 0; i--)
retVal[idx++] = value[i];
var dto = new DTO();
dto.Name = retVal.ToString();
dto.Id = 122;
return dto;
}
}
我并不特别知道数据是如何传输的。我收到一个错误:
格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数http://tempuri.org/:ReverseStringResult时出错。 InnerException消息是''EndElement''命名空间'http://tempuri.org/'中的'ReverseStringResult'不是预期的。期待元素'_x003C_Id_x003E_k__BackingField'。'。有关详细信息,请参阅InnerException。
在winform中,我正在创建与此的连接:
private IStringReverser pipeProxy;
public Form1()
{
InitializeComponent();
ChannelFactory<IStringReverser> httpFactory =
new ChannelFactory<IStringReverser>(
new BasicHttpBinding(),
new EndpointAddress(
"http://localhost:8000/Reverse"));
ChannelFactory<IStringReverser> pipeFactory =
new ChannelFactory<IStringReverser>(
new NetNamedPipeBinding(),
new EndpointAddress(
"net.pipe://localhost/PipeReverse"));
//IStringReverser httpProxy = httpFactory.CreateChannel();
pipeProxy = pipeFactory.CreateChannel();
}
我不明白错误信息或如何纠正错误信息。如何定义反序列化的方式?序列化好吗?
答案 0 :(得分:1)
使用数据合同:
[DataContract]
public class DTO
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
}