[英]Adding service references to multiple WCF services that shared classes
我正在嘗試將我的WCF Web服務拆分為一些服務,而不是一個巨大的服務。 但Visual Studio(Silverlight客戶端)復制了兩個服務共享的公共類。 這是一個簡單的例子來說明我的問題。
在此示例中,有兩個服務。 兩者都返回“Person”類型。 默認情況下,VS將在唯一的NameSpaces下創建兩個單獨的Person代理。 這意味着不同服務返回的“Person”不能被客戶端消費為同一個東西。 我該如何解決? 沒有自己編寫代理類是否可能?
[DataContract]
public class Person
{
[DataMember]
string FirstName { get; set; }
[DataMember]
string LastName { get; set; }
[DataMember]
string PrivateData { get; set; }
}
[ServiceContract(Namespace = "")]
public class StaffService
{
[OperationContract]
public Person GetPerson ()
{
return new Person {"John", "Doe", "secret"};
};
}
[ServiceContract(Namespace = "")]
public class PublicService
{
[OperationContract]
public Person GetPerson ()
{
return new Person {"John", "Doe", "*****"};
};
}
謝謝你的幫助! 賈斯汀
“添加服務引用”的“高級”部分下有一個復選框,名為“在引用的程序集中重用類型”。 這將搜索您的服務中使用的類型,如果它們已經存在於引用的程序集中,那么它們將被使用而不是生成的代理類。
這里需要注意的是,它只是被搜索的“引用程序集”,因此它不會獲取其他服務生成的代理(我相信不同的命名空間也會阻止它)。
我通常在我的Silverlight項目中有一個業務/域項目,所以我將我的共享類添加到該項目中(通常使用“添加現有項”>“添加為鏈接”,以便共享代碼)。
完成后,您可以生成服務引用,他們應該選擇現有類型。
希望這可以幫助
如果使用svcutil.exe同時生成代理,則只生成一種類型。 我不知道如何通過向項目添加服務引用來實現此目的。
我們在一個批處理文件中運行它,所以我將其剪切並更改名稱以保護無辜者。 它實際上是將服務命名空間映射到一起,然后將所有URL包括在一起 。 它還具有集合類型集(用於列表)並包含程序集引用(其他一些答案引用。
@ECHO OFF
SET cmd=C:\"Program Files"\"Microsoft SDKs"\Windows\v6.0a\bin\SvcUtil.exe
SET cmd=%cmd% /out:Traffic.cs /noConfig /collectionType:System.Collections.Generic.List`1
SET cmd=%cmd% /reference:..\..\..\lib\Architecture.Frameworks.dll
REM ######### Service namespace mappings (Service Contracts and Message Contracts)
SET cmd=%cmd% /namespace:"http://services.test.com/app/2005/09/"
SET cmd=%cmd%,"app.ServiceProxies"
REM ######### Schema namespace mappings (Data Contracts)
SET cmd=%cmd% /namespace:"http://schemas.company.com/app/2005/09/"
SET cmd=%cmd%,"Co.ServiceProxies.app.DataContracts"
REM ######### Set all the URLs that have common types
SET cmd=%cmd% http://localhost/Services/MyService1.svc
SET cmd=%cmd% http://localhost/Services/MyService2.svc
%cmd%
PAUSE
如果所有項目都在同一個服務命名空間中,那么您可能只需擁有所有URL而不用擔心命名空間,但我沒有嘗試過這種方式。
svcutil.exe可以重用指定程序集中的類型。 如果手動運行svcutil.exe,可以通過設置服務引用屬性或/ reference鍵來配置它。
如果您是所提及服務的所有者,請考慮將Person類等數據類型放入單獨的程序集中,該程序集可從客戶端和服務中獲得。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.