c# - 无法通过 WCF 中的构造函数初始化成员

标签 c# asp.net .net wcf

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

最佳答案

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

如果你想在对象之间有很强的依赖性,那么你不能使用服务引用,你需要将契约提取到一个你可以引用的单独程序集中。

1) CibilWcfService.Contract - 包含 ICIBIL 接口(interface) + 数据契约(Contract)对象。 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 程序集。您像这样创建服务 channel ,然后新的 CibilEnquiry() 使用与契约(Contract)中定义的相同的构造函数。您需要为 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);
}

关于c# - 无法通过 WCF 中的构造函数初始化成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33752947/

相关文章:

c# - AppDomain,运行程序集 .exe 或 .dll?

.NET 库/人群模拟书籍

asp.net 能否将 cookieless 与 cookie session 存储的 session 数据混合在一起?

c# - 尝试使用 LINQ 表达式创建 "Fluent"类型类

c# - 我可以依靠 OSVERSIONINFO.szCSDVersion 或 Environment.OSVersion.ServicePack 始终采用 "Service Pack X"形式吗?

c# - 在 c# winApplication 中使用 SSL

c# - Entity Framework SaveChanges 失败增量标识列

c# - 如何禁用 WPF ListBox 中的水平滚动?

c# - asp.net c# 代码在 Firefox 上无法正常工作,在其他浏览器上工作正常

ASP.NET MVC 通过 ActionLink 传递模型