博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Winform客户端引用WCF客户端后,部分类无法正常使用
阅读量:6700 次
发布时间:2019-06-25

本文共 6226 字,大约阅读时间需要 20 分钟。

作者:jiankunking 出处:

在项目中用到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));            }        }    }
该实体类代码为:

///     /// 数据源信息    ///     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类的相关信息。希望知道原因的朋友留言说一下,谢谢。

你可能感兴趣的文章
java 消息摘要算法MD
查看>>
Web Service security UserNameToken 使用
查看>>
I/O重定向
查看>>
去除vue项目中的#及其ie9兼容性
查看>>
linux实例 批量修改图片文件名
查看>>
day15(mysql 的多表查询,事务)
查看>>
IOS
查看>>
beta冲刺第三天
查看>>
beta第二天
查看>>
工作中常用的但是又容易忽略的问题
查看>>
css特殊情况
查看>>
洛谷 P2735 电网 Electric Fences Label:计算几何--皮克定理
查看>>
Vue + webpack 项目配置化、接口请求统一管理
查看>>
关于电脑的基础单词笔记
查看>>
安卓App设计博文
查看>>
11.8 开课二个月零四天 (Jquery)
查看>>
ZEN CART 在LINUX系统下设置邮箱方法---用GMAIL设置,方法选择SMTPAUTH
查看>>
ofstream的使用方法--超级精细。C++文件写入、读出函数(转)
查看>>
DOM剪切板
查看>>
10.高效分布
查看>>