Winform客戶端引用WCF客戶端後,部分類無法正常使用
作者:jiankunking 出處:http://blog.csdn.net/jiankunking
在專案中用到WCF,專案的結構是這樣的:
在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類的相關資訊。希望知道原因的朋友留言說一下,謝謝。
相關文章
- 物理DataGuard客戶端無縫切換--客戶端TAF 配置客戶端
- GitHub Windows客戶端無法登入GithubWindows客戶端
- FtpWebRequest類_ftp客戶端FTPWeb客戶端
- github客戶端使用Github客戶端
- WCF 關閉預設除錯客戶端除錯客戶端
- ftp客戶端,ftp客戶端軟體具體怎麼使用?FTP客戶端
- FTP 客戶端使用教程FTP客戶端
- MQTTJava客戶端的使用MQQTJava客戶端
- redis客戶端的使用Redis客戶端
- dubbo客戶端客戶端
- Pulsar客戶端客戶端
- mqtt 客戶端MQQT客戶端
- 客戶端,服務端客戶端服務端
- 服務端,客戶端服務端客戶端
- 使用多種客戶端消費WCF RestFul服務(一)——服務端客戶端REST服務端
- WCF 客戶端 BasicHttpBinding 相容 HTTPS 和 HTTP客戶端HTTP
- Nacos - 客戶端心跳續約及客戶端總結客戶端
- 【DATAGUARD】物理dg配置客戶端無縫切換 (八.3)--客戶端TAF 配置客戶端
- WCF服務端丟擲的異常會跑到客戶端服務端客戶端
- 無密碼驗證:客戶端密碼客戶端
- Solr 客戶端查詢語法Solr客戶端
- 使用 Webix 建立 Email 客戶端WebAI客戶端
- NEO-GUI 客戶端使用GUI客戶端
- dbus客戶端使用指南客戶端
- odps dship客戶端使用客戶端
- ubuntu 下svn客戶端使用Ubuntu客戶端
- [Redis 客戶端整合] Java 中常用Redis客戶端比較Redis客戶端Java
- 中文版vnc客戶端,中文版vnc客戶端下載,中文版vnc客戶端如何使用?VNC客戶端
- 客戶端加解密客戶端解密
- Zookeeper 客戶端 API客戶端API
- java websocket 客戶端JavaWeb客戶端
- 客戶端筆記客戶端筆記
- Redis-客戶端Redis客戶端
- redis客戶端管理Redis客戶端
- CXF--客戶端客戶端
- 中斷客戶端客戶端
- symantec10.1企業版部分客戶端無法更新 解決方法客戶端
- ftp客戶端軟體,ftp客戶端軟體哪個好用,使用方法FTP客戶端