簡體   English   中英

將服務引用添加到共享類的多個WCF服務

[英]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; }
}

StaffService.svc

[ServiceContract(Namespace = "")]
public class StaffService
{
     [OperationContract]
     public Person GetPerson ()
     {
         return new Person {"John", "Doe", "secret"};
     };
}

PublicService.svc

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM