我正在努力实现以下目标:
我试图解决这个问题的方法是创建一个实现两个接口的服务
例如:
公共服务界面
[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的访问以保护内部服务。
关键是两个合同中都暴露了一些操作,我不想复制它们的实现。
有什么想法吗?我是以错误的方式解决这个问题吗?
干杯, 罗布
答案 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>
希望这有帮助。