程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 關於WCF的共享數據契約疑問

關於WCF的共享數據契約疑問

編輯:關於.NET

最近在做項目的時候,發現同一個數據契約再客戶端隸屬於兩個不同的命名空 間,為此如果兩個服務進行交互的時候會涉及到類型 的問題,互操作性很差,要進 行不必要的拆和裝,在前面終於讓我找到了答案,下面我來描述一下這個場景,大家 請看下面。

[實體類]  大家請注意命名空間

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GaryChenWCFService
{
   /// <summary>
   /// 測試實體類
   /// </summary>
   public class Customer
   {
     public string Name
     {
       get;
       set;
     }
     public string Sex
     {
       get;
       set;
     }
   }
}

下面是1號服務  注意:返回的是GaryChenWCFService.Customer類型的對象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GaryChenWCFService.ServiceClasses
{
   public class OneCustomerService  :ServiceContracts.IOneCustomer
   {
     #region IOneCustomer 成員
     public GaryChenWCFService.Customer GetCustomer()
     {
      //省略
     }
     #endregion

下面是2號服務  注意:添加的是GaryChenWCFService.Customer類型的對象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GaryChenWCFService.ServiceClasses
{
   public class TwoCustomerService :  ServiceContracts.ITwoCustomer
   {
     #region ITwoCustomer 成員
     public void AddCustomer( GaryChenWCFService.Customer cs  )
     {
       //省略
     }
     #endregion
   }
}

宿主部分我們省略...我們來看客戶端,問題來了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GaryChenClient
{
   class Program
   {
     static void Main( string[] args )
     {
      OneCustomerService_Proxy.OneCustomerClient  OneService_Proxy = new  GaryChenClient.OneCustomerService_Proxy.OneCustomerClient();
      TwoCustomerService_Proxy.TwoCustomerClient  TwoService_Proxy = new  GaryChenClient.TwoCustomerService_Proxy.TwoCustomerClient();
      OneCustomerService_Proxy.Customer cu =  OneService_Proxy.GetCustomer();
      TwoService_Proxy.AddCustomer(cu);
     }
   }
}

1號服務取得的Customer屬於OneCustomerService命名空間,現在我要把這個取 得出來的對象放入2號服務去進行處理,

這就出現了同一個數據契約兩個不同的命名空間問題,大家看一下對象浏覽器 兩個代理所生成的東西,

這樣一來我們如果要放進2號服務去操作的話必須顯示聲明 TwoCustomerService_Proxy.Customer進行轉換,這樣的場景或許大家都經常碰到, 下面我說一下解決辦法,

按照WCF編程第二版中的說法,我把原話給大家發一下

在Visual Studio 2008添加一個服務引用時,你必須為每個服務引用提供唯一 的新命名空間。導入的類型會定義在這個新的命名空間中。如果為共享了相同數 據契約的兩個不同服務添加引用,就會出現問題,因為你得到了兩個不同的類型 ,在兩個不同的命名空間,表示的卻是相同的數據契約。然而,默認情況下,如 果被客戶端引用的任意一個程序集包含的數據契約,與已經暴露在引用服務元數 據的數據契約類型匹配,Visual Studio 2008就不會再次導入。需要再次強調的 是,已有的數據契約引用必須是在另一個引用程序集中,而不是在客戶端項目自 身。這一限制會在未來的Visual Studio版本中提供,而目前最方便的彌補措施與 最佳實踐則為:將所有共享的數據契約分解到指定的類庫中,並讓所有的客戶端 引用該程序集。然後,通過服務引用的高級設置對話框(參見圖1-10),可以控 制和配置引用程序集(如果存在)與有關的共享數據契約進行協調。“Reuse types in referenced assemblies”檢查框默認是被選中的,但如果你需要也可 以關閉這一功能。顧名思義,你只能共享數據契約,卻不能共享服務契約。使用 裡面的單選按鈕,可以讓Visual Studio 2008跨所有的引用程序集重用數據契約 ,或者通過選擇列表項限制對特定程序集的共享。

s這段話的意思就是讓你把我服務端的DLL引用到客戶端來,在服務配置中來共 享同一個數據契約,見下圖

大家看見沒有,需要指定服務引用的程序集,這樣才不會存在命名空間類型的問 題,這樣做我知道非常不合理,但是如果客戶端自己開發的話而不是其他平台調用 的話這樣也是沒有辦法中的辦法,期待WCF下一個版本可以改進這一點!!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved