将服务引用添加到共享类的多个WCF服务

时间:2009-05-20 18:58:04

标签: c# wcf silverlight web-services proxy

我正在尝试将我的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", "*****"};
     };
}

谢谢你的帮助! 贾斯汀

3 个答案:

答案 0 :(得分:8)

“添加服务引用”的“高级”部分下有一个复选框,名为“在引用的程序集中重用类型”。这将搜索您的服务中使用的类型,如果它们已经存在于引用的程序集中,那么它们将被使用而不是生成代理类。

这里有一点需要注意,它只是被搜索的“引用程序集”,因此它不会获取其他服务生成的代理(我相信不同的命名空间也会阻止它)。

我的Silverlight项目中通常有一个业务/域项目,所以我将我的共享类添加到该项目中(通常使用“添加现有项”>“添加为链接”,以便共享代码)。

完成后,您可以生成服务引用,并且应该选择现有类型。

希望这有帮助

答案 1 :(得分:3)

如果使用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而不用担心命名空间,但我没有尝试过这种方式。

答案 2 :(得分:-1)

svcutil.exe可以重用指定程序集中的类型。如果手动运行svcutil.exe,可以通过设置服务引用属性或/ reference键来配置它。

如果您是所提及服务的所有者,请考虑将Person类等数据类型放入可从客户端和服务中获得的单独程序集中。