我有一个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();
的情况下工作正常,在构造函数中初始化就足够了。
答案 0 :(得分:3)
通过添加服务引用生成的代理对象与您在服务协定中定义的对象不同,它们恰好在消费客户端服务引用下的同一命名空间等中创建。基本上它们只是您用来使用服务的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);
}