[英]How do you return a user defined type from a WCF service?
我在IIS中托管了WCF服務。 目的是讓客戶進行調用並接收在另一個項目/ dll中定義的自定義類。 我使用svcutil.exe生成了一個服務客戶端。 問題是這個自動生成的客戶端包含我嘗試從服務返回的類的新的部分/代理定義。 它現在在編譯時拋出我的原始自定義類和新的部分定義之間的轉換錯誤。 那么如何從WCF服務返回用戶定義的類型? 建議表示贊賞。
如果要從服務調用返回的類型未標記為DataContract
則在未向客戶端應用程序提供同一程序集的副本的情況下,您將無法從WCF返回該類型。
using System;
using System.ServiceModel;
[ServiceContract]
interface IService
{
[OperationContract]
TimeSpan GetTimeSpan();
}
class Service : IService
{
public TimeSpan GetTimeSpan() { return DateTime.Now.TimeOfDay; }
}
為什么之前的代碼可以工作呢? 它的工作原理是因為服務調用的兩端都有System.dll
因此它們都知道System.TimeSpan
類型,它是OperationContract GetTimeSpan()
的返回類型。
以下是使用DataContract
的示例:
using System;
using System.ServiceModel;
using System.Runtime.Serialization;
[ServiceContract]
interface IService
{
[OperationContract]
Contract GetContract();
}
[DataContract]
class Contract
{
[DataMember]
public String MyProperty { get; set; }
}
class Service : IService
{
public Contract GetContract() { return new Contract(); }
}
現在,您已為已定義的類( Contract
)提供了序列化屬性 - 這將允許您使用svcutil.exe
在客戶端應用程序中創建將被序列化並發送到WCF服務的代理類。
現在,如果要返回不是DataContract
的類型,則必須向客戶端應用程序提供包含該類型的程序集的副本。
需要做的事情之一是用戶必須配置服務引用以使用DLL中的類型而不是代理定義的類 - http://msdn.microsoft.com/en-us/library/ bb628653.aspx
我們過去曾沿着這條路走下去,問題當然是,這些是兩個不同的類,所以你必須遵循@Rich Reuter提供的鏈接;
但是,我們已經了解了為什么這是不好的做法,因為它再次成為SOA的第三個原則 - “服務共享架構和合同,而不是類”。
當然問題不僅僅是不遵循某人在某個時候設定的“規則”,而是有充分的理由建議這一點 - 我們已經了解到服務與客戶之間這種緊密耦合的代價意味着它很難釋放 - 如果服務需要向該類添加另一個字段,為另一個客戶端提供服務 - 第一個客戶端可能會受到影響; 如果服務需要更改該類定義中的某些內容(以服務另一個客戶端) - 第一個客戶端將再次受到影響,反之亦然 - 客戶端可能會影響服務的生命周期。
在大型項目中,這很快就會成為巨大的維護負擔。
我以前走過這條路,並且在某些方面希望我沒有。 可擴展性/自定義序列化 - 您必須非常小心。 如果使用預卷序列化程序(例如protobuf-net (可以直接集成到WCF中,並且設計時考慮了可擴展性),則會更容易一些,但並不容易。
實際上,共享類的一個優點是它使測試更容易:因為你到處都有相同的IFoo
,你可以用合理的成功機會模擬IFoo
。 當代理涉及時(當您在測試代碼和生產代碼之間更改更多移動部分時)更難模擬。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.