【发布时间】:2014-11-26 12:30:36
【问题描述】:
我对整个 WCF 还是很陌生,英语不是我的主要语言,所以请耐心等待。
我正在尝试将自定义对象从应用程序发送到我设置的 WCF 服务。它适用于诸如简单字符串之类的基本内容,但是当涉及更复杂和自定义的对象时,它会接收对象,而不是内容。 IE。内容全为0/null。
我尝试了堆栈周围不同帖子中建议的一些答案,但没有一个对我有用。
所以,代码(去掉一些杂乱,并保留相关的内容。):
合同:
[ServiceContract]
//[ServiceKnownType(typeof(AClient))]
//[ServiceKnownType(typeof(AddressInfo))]
public interface ISIA
{
[OperationContract]
AClient TransferCreditor(AClient client);
}
尝试使用已知类型和不使用它们。
操作(服务端):
public AClient TransferClient(AClient client)
{
return MethodThatDoesStuff.insertClient(client);
}
AClient 类:
[DataContract(IsReference = true)]
public class AClient
{
[DataMember]
public int PhoneNo { get; set; }
[DataMember]
public string Email { get; set; }
[DataMember]
public string CompanyNo { get; set; }
[DataMember]
public string CompanyName { get; set; }
[DataMember]
public bool VatLiable { get; set; }
[DataMember]
public string BankAccount { get; set; }
[DataMember]
public string ContactName { get; set; }
[DataMember]
public string CompanyEmail { get; set; }
[DataMember]
public AddressInfo Address { get; set; }
[DataMember]
public bool SendeInkVarsSelv { get; set; }
[DataMember]
public bool MVAplikt { get; set; }
[DataMember]
public bool GodkjentAvtale { get; set; }
[DataMember]
public bool RBpurrerSelv { get; set; }
[DataMember]
public bool StarteInkasso { get; set; }
[DataMember]
public int AntPurringer { get; set; }
[DataMember]
public string KonsernNr { get; set; }
[DataMember]
public string KreditorNr { get; set; }
}
AddressInfo 类:
[DataContract(IsReference = true)]
public class AddressInfo
{
[DataMember]
public string Address1 { get; set; }
[DataMember]
public string Address2 { get; set; }
[DataMember]
public string ZipCode { get; set; }
[DataMember]
public string City { get; set; }
[DataMember]
public string CountryCode { get; set; }
}
客户端对服务的调用:
internal void TransferClient(AClient client)
{
try
{
AClient kvitt = s.TransferClient(client);
}
catch(Exception e)
{ }
}
不知道它是否相关,但我的 App.config 设置为绑定:
<netTcpBinding>
<binding name="netTcpBinding" closeTimeout="01:01:00" openTimeout="01:01:00" receiveTimeout="01:01:00" sendTimeout="01:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="5242880" maxBufferSize="5242880" maxConnections="15" maxReceivedMessageSize="5242880">
<readerQuotas maxDepth="64" maxStringContentLength="52428800" maxArrayLength="16384" maxBytesPerRead="8192" maxNameTableCharCount="163840" />
<reliableSession ordered="true" inactivityTimeout="01:01:00" enabled="false" />
<security mode="None">
<transport clientCredentialType="None" />
<message clientCredentialType="None"/>
</security>
</binding>
</netTcpBinding>
在调试中,我看到了这个(右侧是客户端,离开了服务): http://imgur.com/vZvDB8S
红线包含实际数据,我不得不将它们空白,因为它们是个人数据,所以^^
所以我的问题是,当我知道我发送的对象包含数据的事实时,有谁知道我为什么在服务端收到一个“空白”对象?我哪里出错了? 我希望我涵盖了所有需要的数据,如果有任何遗漏,请告诉我。 感谢您抽出宝贵时间查看我的问题!
【问题讨论】:
-
你调试客户端了吗?客户端是否真的使用所需的对象调用
TransferClient? -
是的,我可以看到它正在被调用,并且我可以看到所需的 objekt,但该对象仅包含 null / 0 作为信息,而不是我尝试发送的实际信息。
-
看起来很奇怪,因为您显然对基本类型没有任何问题。您是否调试到服务器端以确保接收到的对象是“空的”?
-
是的,我也这样做了 ^^ 我刚刚设法自己解决了这个问题,当我在写对您问题的回复时,我注意到数据对象有两个不同的名称空间,并简单地尝试了将数据对象从客户端导入服务器以使其脱离循环。这似乎解决了我的问题。在某些时候,我必须将服务器的数据对象拆分到自己的命名空间中,而不是共享客户端和服务器文件。谢谢您的帮助! :)