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

时间:2011-11-08 12:46:16

标签: wcf wcf-binding

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

  • 为内部应用程序消费提供一套“完整”服务
  • 将这些方法的一部分公开给第三方

我试图解决这个问题的方法是创建一个实现两个接口的服务

例如:

公共服务界面

[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中的所有操作,如果我添加/ public到URL,我会看到404.那么我该如何实现呢?

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

关键是两个合同中都暴露了一些操作,我不想复制它们的实现。

有什么想法吗?我是以错误的方式解决这个问题吗?

干杯, 罗布

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

观察:实现这两个接口的Service类似乎有误。两个接口都有相同的方法名OperationAvailableToEveryone,因为你必须明确地实现你的接口。

我甚至有同样的query。事实上,您无法使用http://localhost:8001/service.svc/public而不是http://localhost:8001/public/service.svc进行浏览。您仍然可以使用http://localhost:8001/service.svc创建代理,并且正常使用它,并且您的客户端地址看起来像

    </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>

希望这有帮助。