【问题标题】:Unable to initialize member through Constructor in WCF无法通过 WCF 中的构造函数初始化成员
【发布时间】:2016-02-18 14:07:18
【问题描述】:

我有一个 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(); 的情况下运行良好,在构造函数中初始化就足够了。

【问题讨论】:

    标签: c# asp.net .net wcf


    【解决方案1】:

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

    如果您想在对象之间建立强依赖关系,则不能使用服务引用,您需要将合同提取到可以引用的单独程序集。

    1) CibilWcfService.Contract - 包含 ICIBIL 接口 + 数据合约对象。 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);
    }
    

    【讨论】:

    • GenerateEnquiry 方法稍后调用。我在应用程序中分配值 CibilEnquiryEnq.Tuef.Version = "1111"; 而不是 wcf。
    • 你的意思是你想让我在 CibilEnquiry 中添加这段代码而不删除CibilEnquiry() 构造函数?
    • 好的,我想我错了,您正在使用服务引用创建服务,然后为您的消费客户端创建必要的类。但是,这不会创建与您在数据合同中定义的类似的构造函数。您需要将数据合同提取到合同程序集中,您可以同时引用客户端和服务器,然后使用通道工厂为您的服务创建通道。
    • 我该怎么做?听起来很复杂。是吗?
    • 如果您还没有注意到,请更新我的答案。
    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多