开发者社区> 衣舞晨风> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Winform客户端引用WCF客户端后,部分类无法正常使用

简介: 在项目中用到WCF,项目的结构是这样的: 在SPI项目中编写该解决方案中公共的类及函数; 在WCFService项目中写的是svc文件及WCF服务接口; 在Client中添加WCF服务引用的时候该WCFService项目,然后再UI项目中初始化Client的实例。通过该实例WCFService中的方法。 问题: 有时会出现这么一种情况,在UI中通过初始化Client的实例。通过该实例W
+关注继续查看

在项目中用到WCF,项目的结构是这样的:


在SPI项目中编写该解决方案中公共的类及函数;
在WCFService项目中写的是svc文件及WCF服务接口;
在Client中添加WCF服务引用的时候该WCFService项目,然后再UI项目中初始化Client的实例。通过该实例WCFService中的方法。
问题:

有时会出现这么一种情况,在UI中通过初始化Client的实例。通过该实例WCFService中的方法MethodA,该方法的入参是SPI中类ConnectionInfo的实例,然后在UI中再次使用类ConnectionInfo时会发现ConnectionInfo是在Client命名空间下的类,而不是在SPI命名空间下的类。

在WCF自动生成的客户端代理类(Reference.cs文件),会将SPI中的类ConnectionInfo,序列化成

   

 [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="ConnectionInfo", Namespace="http://schemas.datacontract.org/2004/07/HaiChuang.AMAC.DataSourceSettings.SPI.Mod" +
        "el")]
    [System.SerializableAttribute()]
    public partial class ConnectionInfo : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
        
        [System.NonSerializedAttribute()]
        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string ConnectionStringField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string GuidField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string LocationField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string MenuGuidField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string NameField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string TypeField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private int idField;
        
        [global::System.ComponentModel.BrowsableAttribute(false)]
        public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
            get {
                return this.extensionDataField;
            }
            set {
                this.extensionDataField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string ConnectionString {
            get {
                return this.ConnectionStringField;
            }
            set {
                if ((object.ReferenceEquals(this.ConnectionStringField, value) != true)) {
                    this.ConnectionStringField = value;
                    this.RaisePropertyChanged("ConnectionString");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string Guid {
            get {
                return this.GuidField;
            }
            set {
                if ((object.ReferenceEquals(this.GuidField, value) != true)) {
                    this.GuidField = value;
                    this.RaisePropertyChanged("Guid");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string Location {
            get {
                return this.LocationField;
            }
            set {
                if ((object.ReferenceEquals(this.LocationField, value) != true)) {
                    this.LocationField = value;
                    this.RaisePropertyChanged("Location");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string MenuGuid {
            get {
                return this.MenuGuidField;
            }
            set {
                if ((object.ReferenceEquals(this.MenuGuidField, value) != true)) {
                    this.MenuGuidField = value;
                    this.RaisePropertyChanged("MenuGuid");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string Name {
            get {
                return this.NameField;
            }
            set {
                if ((object.ReferenceEquals(this.NameField, value) != true)) {
                    this.NameField = value;
                    this.RaisePropertyChanged("Name");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string Type {
            get {
                return this.TypeField;
            }
            set {
                if ((object.ReferenceEquals(this.TypeField, value) != true)) {
                    this.TypeField = value;
                    this.RaisePropertyChanged("Type");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public int id {
            get {
                return this.idField;
            }
            set {
                if ((this.idField.Equals(value) != true)) {
                    this.idField = value;
                    this.RaisePropertyChanged("id");
                }
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
该实体类代码为:

/// <summary>
    /// 数据源信息
    /// </summary>
    public class ConnectionInfo
    {
        public int id { get; set; }
        public string Guid { get; set; }
        public string Name { get; set; }
        public string Location { get; set; }
        public string Type { get; set; }
        public string ConnectionString { get; set; }
        public string MenuGuid { get; set; }

    }

在 CLient项目的wcf引用上右键,可以看到该实体类


在项目中可以找到该dll


打开该dll,可以看到该类的信息


此处看到的类信息是被转成WCF数据契约形式的类信息


解决方案:

  如果要在UI项目中使用SPI命名空间下的类ConnectionInfo,则将Reference.cs文件中的public partial class ConnectionInfo删除,再在UI中引用SPI项目即可。

小注:

如果不进行修改,则在客户端调用WCF服务端方法的时候,获取函数入参类型或者返回值类型的类型(如果该入参、返回值 类型为自定义实体类),是通过WCF服务端获取的,即使该实体类在SPI中,客户端也有,调用的也是服务端的。

就相当于你自己显式将该自定义实体类标记为数据契约。

使用WebService也会出现这种问题,解决思路一样。
但产生这个问题的原因暂时还没有找到,因为UI项目中已经引用SPI项目了,还是会在Reference.cs文件中生成ConnectionInfo类的相关信息。希望知道原因的朋友留言说一下,谢谢。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Winforms界面控件使用小知识
Winforms界面控件使用小知识
3 0
SSH软件:推荐一款非常好用的SSH客户端WindTerm
今天给大家推荐推荐一款非常好用的SSH客户端WindTerm
88 0
在WPF中使用WinForm控件方法
原文:在WPF中使用WinForm控件方法 1、      首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll。
993 0
几款GIT带UI界面的客户端工具
几款GIT带UI界面的客户端工具   工欲善其事,必先利其器。 作为一名开发人员,你不可能不知道git,无论你是开发自己的开源项目还是和团队一起进行大规模产品的开发,git都已经是源代码管理工具的首选。
2007 0
Winform 调用WCF客户端,所有服务端方法在运行的时候均找不到(编译没有问题)
  今天在开发过程中遇到了一个很恶心的问题,就是Form窗体ShowDialog的时候,直接报出下面的错误: 有关调用实时(JIT)调试而不是此对话框的详细信息, 请参见此消息的结尾。 ************** 异常文本 ************** System.MissingMethodException: 找不到方法:“XXX.XXX.DataObject.SPI.DataObj
914 0
WCF客户端和服务器时间不一致,导致通道建立失败的问题)
本文转载:http://www.cnblogs.com/bcbr/articles/2288374.html   最近,经常有客户反应,前天还用的好好的系统,今天就不能用了。考虑到系统近来没有做过改动和升级操作,所以从客户的机器环境入手解决,最后发现客户端的日期时间和服务端的日期时间有较大差异,将客户端机器修改成和服务端的日期时间一致后,系统恢复正常。
835 0
+关注
衣舞晨风
http://blog.csdn.net/jiankunking
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载