C# 向共享类的多个WCF服务添加服务引用

C# 向共享类的多个WCF服务添加服务引用,c#,wcf,silverlight,web-services,proxy,C#,Wcf,Silverlight,Web Services,Proxy,我正在尝试将我的WCF web服务拆分为几个服务,而不是一个巨大的服务。但是VisualStudio(Silverlight客户端)复制了两个服务共享的公共类。这里有一个简单的例子来说明我的问题 在本例中,有两个服务。两者都返回“Person”类型。默认情况下,VS将在唯一名称空间下创建两个独立的个人代理。这意味着不同服务返回的“人”不能被客户机作为同一事物使用。我该如何解决这个问题?不需要自己编写代理类就可以了吗 普通的 StaffService.svc PublicService.svc 谢

我正在尝试将我的WCF web服务拆分为几个服务,而不是一个巨大的服务。但是VisualStudio(Silverlight客户端)复制了两个服务共享的公共类。这里有一个简单的例子来说明我的问题

在本例中,有两个服务。两者都返回“Person”类型。默认情况下,VS将在唯一名称空间下创建两个独立的个人代理。这意味着不同服务返回的“人”不能被客户机作为同一事物使用。我该如何解决这个问题?不需要自己编写代理类就可以了吗

普通的 StaffService.svc PublicService.svc 谢谢你的帮助!
Justin

如果同时使用svcuti.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可以重用指定程序集中的类型。您可以通过设置服务引用属性或在运行sv时通过/reference键来配置此项手动执行cutil.exe


如果您是上述服务的所有者,请考虑将数据类型如Head类放入客户机和服务都可用的独立程序集中。

< P>在“添加服务引用”的高级部分下面有一个复选框,称为“引用程序集中的重用类型”。。这将查找服务中使用的类型,如果它们已存在于引用的程序集中,则将使用它们,而不是生成代理类

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

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

完成后,您就可以生成服务引用,它们应该会选择您现有的类型


希望这能有所帮助

谢谢Brian。你有没有一个例子或链接来解释如何做到这一点?我会在这段时间内开始自己查找。Brian感谢你的回答。我最终使用了另一个解决方案,但我可以看到这个解决方案在不久的将来非常有用。你可以通过“添加服务参考”中的高级设置来实现这一点e对话框。谢谢Nigel。我在高级对话框中看到了“在引用的程序集中重用类型”复选框。默认情况下,它似乎处于启用状态。您是正确的,它似乎没有拾取由其他服务生成的代理。当您谈到添加您自己的共享类时,我假设它们来自“Silverlight类库”?听起来像是您自己生成代理并与服务共享它。对吗?我在客户端和服务器之间共享了DataContract,我通过“添加现有项”来实现这一点,诀窍是确保您选择“添加为链接”这意味着类在两者之间共享。本质上,我仍然在生成服务代理(StaffServiceClient),但没有生成类(Person)。太棒了,奈杰尔。我已经完成了这个解决方案及其工作。经过一点修改,我发现您必须填充“名称空间”属性,或者由于某种原因,它没有拾取类。另外,我必须为客户端的代理创建单独的程序集,这真的很烦人。如果我可以将源链接到创建服务所在的同一个项目,那会更好。原因是我已经将服务放入了它拥有自己的项目,因此可以与其他项目共享。
[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", "*****"};
     };
}
@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