【问题标题】:WCF - same service on different IIS .svc endpoints with multiple interfacesWCF - 具有多个接口的不同 IIS .svc 端点上的相同服务
【发布时间】:2011-12-24 10:25:15
【问题描述】:

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

  • 拥有一套“完整”的服务供内部应用使用
  • 将这些方法的一部分公开给第三方

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

例如:

公共服务接口

[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 的访问以保护内部服务。

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

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

干杯, 抢

【问题讨论】:

    标签: wcf wcf-binding


    【解决方案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>
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢!非常有趣,我最终没有找到解决这个问题的方法,最后这个项目也没有成功。但现在我得试一试:)
    【解决方案2】:

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

    【讨论】:

    • 你说得对——我试图走捷径来获得概念验证服务,但实际上是走错路了。我已经完全按照你说的做了,将实现移到了一个共享程序集中(已经在一个共享程序集中有合同)并设置了两个单独的站点。
    猜你喜欢
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多