WCF-具有多个接口的不同IIS.svc终结点上的相同服务

WCF-具有多个接口的不同IIS.svc终结点上的相同服务,wcf,wcf-binding,Wcf,Wcf Binding,我正在努力实现以下目标: <%@ ServiceHost Language="C#" Debug="true" Service="Adactus.Pulse.SOAServices.Service, Adactus.Pulse.SOAServices" %> 拥有一套“完整”的服务供内部应用程序使用 向第三方公开这些方法的子集 我尝试的方法是创建一个实现两个接口的服务 例如: 公共服务接口 [ServiceContract(Namespace = "http://www.

我正在努力实现以下目标:

<%@ ServiceHost Language="C#" Debug="true"  Service="Adactus.Pulse.SOAServices.Service, Adactus.Pulse.SOAServices"  %> 
  • 拥有一套“完整”的服务供内部应用程序使用
  • 向第三方公开这些方法的子集
我尝试的方法是创建一个实现两个接口的服务

例如:

公共服务接口

[ServiceContract(Namespace = "http://www.myurl.com/public/2011/10")]
public partial interface IPublicService
{
    [OperationContract]
    ResponseObjOne OperationAvailableToEveryone(RequestObjOne request);
}
[ServiceContract(Namespace = "http://www.myurl.com/private/2011/10")]
public partial interface IPrivateService
{
    [OperationContract]
    ResponseObjOne OperationAvailableToEveryone(RequestObjOne request);

    [OperationContract]
    ResponseObjTwo OperationAvailableInternally(RequestObjTwo request);
}
专用服务接口

[ServiceContract(Namespace = "http://www.myurl.com/public/2011/10")]
public partial interface IPublicService
{
    [OperationContract]
    ResponseObjOne OperationAvailableToEveryone(RequestObjOne request);
}
[ServiceContract(Namespace = "http://www.myurl.com/private/2011/10")]
public partial interface IPrivateService
{
    [OperationContract]
    ResponseObjOne OperationAvailableToEveryone(RequestObjOne request);

    [OperationContract]
    ResponseObjTwo OperationAvailableInternally(RequestObjTwo request);
}
实现两个接口的服务类

public class Service : IPrivateService, IPublicService
{
    ResponseObjOne OperationAvailableToEveryone(RequestObjOne request)
    { }

    ResponseObjTwo OperationAvailableInternally(RequestObjTwo request)
    { }
}
我现在希望能够将其配置为在IIS中作为两个独立的端点运行。因此,我有一个.svc文件,其中包含以下内容:

<%@ ServiceHost Language="C#" Debug="true"  Service="Adactus.Pulse.SOAServices.Service, Adactus.Pulse.SOAServices"  %> 

并在web.config中添加了以下内容:

  <service name="Service">
    <endpoint address="/public" binding="basicHttpBinding" contract="IPublicService" />
    <endpoint address="/private" binding="basicHttpBinding" contract="IPrivateService" />
  </service>

但是如果我浏览到.svc文件,我现在会看到WSDL中的所有操作,如果我向URL添加/public,我会看到404。那么我如何才能做到这一点呢

理想情况下,我希望添加另一个.svc端点,并能够在这些svc文件中指定接口和服务实现类。然后我可以在IIS中锁定对svc的访问以保护内部服务

关键是有些操作在两个合同中都公开了,我不想重复它们的实现

有什么想法吗?我是不是走错了路

干杯,
Rob

虽然它不能回答您的问题,但我绝对不会这样设计它。我将创建一个包含两个接口及其实现的单一类库,然后创建单独的WCF项目,公开不同的接口。

观察结果:实现两个接口的服务类似乎是错误的。两个接口都有相同的方法名
操作,每个人都可以使用
实际上,您必须显式地实现接口

我甚至有同样的。事实上,您不能使用
http://localhost:8001/service.svc/public
取而代之的是
http://localhost:8001/public/service.svc
。您仍然可以使用
http://localhost:8001/service.svc
您可以正常使用它,您的客户端enpoint地址如下所示

    </client>
        <endpoint address="http://localhost:8001/SOAService.svc/public"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IPublicService"
            contract="SOAService.IPublicService" name="BasicHttpBinding_IPublicService" />
        <endpoint address="http://localhost:8001/SOAService.svc/private"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IPrivateService"
            contract="SOAService.IPrivateService" name="BasicHttpBinding_IPrivateService" />
    </client>


希望这能有所帮助。

你说得对-我试图走捷径获得概念验证服务,但实际上走错了方向。我完全按照你说的做了,将实现移动到共享程序集中(已经在共享程序集中签订了合同),并设置了两个独立的站点。谢谢!非常有趣,我最终没有找到解决这个问题的方法,最终这个项目从未启动。但现在我必须试一试:)