【问题标题】:Wcf service only receives null on transfer complex objectWcf 服务仅在传输复杂对象时接收 null
【发布时间】: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 作为信息,而不是我尝试发送的实际信息。
  • 看起来很奇怪,因为您显然对基本类型没有任何问题。您是否调试到服务器端以确保接收到的对象是“空的”?
  • 是的,我也这样做了 ^^ 我刚刚设法自己解决了这个问题,当我在写对您问题的回复时,我注意到数据对象有两个不同的名称空间,并简单地尝试了将数据对象从客户端导入服务器以使其脱离循环。这似乎解决了我的问题。在某些时候,我必须将服务器的数据对象拆分到自己的命名空间中,而不是共享客户端和服务器文件。谢谢您的帮助! :)

标签: c# wcf object service


【解决方案1】:

在我的例子中,问题在于客户端和服务器有自己的数据类版本。只需将客户端的数据类导入服务器即可解决我的问题。

希望有人在他们的 google-fu 期间得到一些使用这个答案,并感谢帮助我设置我的布莱恩!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-04
    • 2020-12-02
    • 1970-01-01
    • 2016-06-27
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多