我有一个CibilResponse类,它具有类类型(TUEF类)的属性。

我正在尝试使用:CibilEnquiryEnq.Tuef.Version = "12";分配值,但是会引发空引用错误。我已经解决了此错误,但是通过创建像CibilEnquiryEnq.Tuef = new CibilWcfService.TUEF();这样的对象,而不是通过构造函数。

ICIBIL.cs

[ServiceContract]
public interface ICIBIL
{

    [OperationContract]
    string InsertCibil(CibilResponse cibilResponse);

    [OperationContract]
    string TestInsert(string testObj);

    [OperationContract]
    string GenerateEnquiry(CibilEnquiry testObj);

}

[DataContract]
public class CibilEnquiry
{
    [DataMember]
    public TUEF Tuef { get; set; }
    public CibilEnquiry()
    {
        this.Tuef = new TUEF();
    }

}


 [DataContract]
    public class TUEF
    {
        [DataMember]
        public string SegmentTag { get; set; }
        [DataMember]
        public string Version { get; set; }
        [DataMember]
        public string MemberReferenceNumber { get; set; }
   }


应用:(不起作用)

CibilWcfService.CIBIL obj = new CibilWcfService.CIBIL();
CibilWcfService.CibilEnquiry CibilEnquiryEnq = new CibilWcfService.CibilEnquiry();
CibilEnquiryEnq.Tuef.Version = "1111"; // null reference error here and Tuef is null


应用:(工作)

CibilWcfService.CIBIL obj = new CibilWcfService.CIBIL();
CibilWcfService.CibilEnquiry CibilEnquiryEnq = new CibilWcfService.CibilEnquiry();
CibilEnquiryEnq.Tuef = new CibilWcfService.TUEF();
CibilEnquiryEnq.Tuef.Version = "1111";//works fine


我不明白为什么我必须添加CibilEnquiryEnq.Tuef = new CibilWcfService.TUEF();才能完成这项工作。我已经在wcf中的构造函数中初始化了tuef。

我在控制台应用程序中创建了一个示例(不包括wcf),并且在没有Tuef = new TUEF();的情况下也可以正常工作,在构造函数中进行初始化就足够了。

最佳答案

通过添加服务引用生成的代理对象与您在服务合同中定义的对象不同,它们恰好是在使用方客户端服务引用下的相同名称空间中创建的。基本上,它们只是您用来使用服务的DTO。

如果要在对象之间具有较强的依赖性,则不能使用服务引用,而需要将合同提取到可以引用的单独程序集中。

1)CibilWcfService.Contract-包含ICIBIL接口+ datacontract对象。您需要引用DataContract相关属性的System.ServiceModel,System.ServiceModel.Web和System.Runtime.Serialization。

2)CibilWcfService-这承载WCF服务并引用CibilWcfService.Contract程序集。

namespace CibilWcfService
{
    using CibilWcfService.Contract;

    public class CibilService : ICIBIL
    {
        // ... Interface implementation
    }
}


3)CibilClient-这是您使用的客户端应用程序,它也引用CibilWcfService.Contract程序集。像这样创建到服务的通道,然后新的CibilEnquiry()使用与合同中定义的相同的构造函数。您需要引用ChannelFactory的System.ServiceModel。

using CibilWcfService.Contract;


var cf = new ChannelFactory<ICIBIL>();
var channel = cf.CreateChannel(new EndpointAddress("http://127.0.01/CibilServiceUri"));

if (channel != null)
{
    var CibilEnquiryEnq = new CibilEnquiry();
    CibilEnquiryEnq.Tuef.Version = "1111";

    channel.GenerateEnquiry(CibilEnquiryEnq);
}

09-25 22:28