一个 WCF 服务中的多个合同_但调用第二个合同时出错
Posted
技术标签:
【中文标题】一个 WCF 服务中的多个合同_但调用第二个合同时出错【英文标题】:Multiple contracts in one WCF service_But error for calling the second contract 【发布时间】:2020-02-01 18:55:17 【问题描述】:我在一个 WCF 中有多个合同:
namespace SysLap.Services.Web.DataExtractor
[ServiceContract]
public interface IServiceDataExtractor
[OperationContract]
[WebGet]
List<User> GetAllUsers(/*CommonParams commonParams*/);
[ServiceContract]
public interface IScopesExtract
[OperationContract]
[WebGet]
List<SyScope> GetAllScopes();
并且 Web.config 配置良好:
<endpoint address="rest" behaviorConfiguration="restBehavior"
binding="webHttpBinding" contract="SysLap.Services.Web.DataExtractor.IServiceDataExtractor" />
<endpoint address="rest" behaviorConfiguration="restBehavior"
binding="webHttpBinding" contract="SysLap.Services.Web.DataExtractor.IScopesExtract" />
</service>
对于 GetAllUsers 服务,它工作得非常好。但是对于 GetAllScopes 服务,当我使用 SOAP UI 对其进行测试时,我收到了这个错误:
<p class="heading1">Request Error</p>
<p>The server encountered an error processing the request. The exception message is 'Multiple filters matched.'.
See server logs for more details. The exception stack trace is: </p>
<p> at System.ServiceModel.Dispatcher.EndpointDispatcherTable.LookupInCache(Message message, Boolean&
addressMatched)
at System.ServiceModel.Dispatcher.EndpointDispatcherTable.Lookup(Message message, Boolean&
addressMatched)
at System.ServiceModel.Dispatcher.ChannelHandler.GetDatagramChannel(Message message, EndpointDispatcher&
endpoint, Boolean& addressMatched)
at System.ServiceModel.Dispatcher.ChannelHandler.EnsureChannelAndEndpoint(RequestContext request)
at System.ServiceModel.Dispatcher.ChannelHandler.TryRetrievingInstanceContextCore(RequestContext request)
</p>
我该如何解决?
谢谢
【问题讨论】:
能否将文本截图转换回纯文本?让其他人更容易搜索相同的问题。 当然可以, 【参考方案1】:你基本上只需要两个独立的端点address
。
更改配置并提供唯一地址,例如:
<endpoint address="DataExtractor" behaviorConfiguration="restBehavior" binding="webHttpBinding" contract="SysLap.Services.Web.DataExtractor.IServiceDataExtractor" />
<endpoint address="ScopesExtractor" behaviorConfiguration="restBehavior" binding="webHttpBinding" contract="SysLap.Services.Web.DataExtractor.IScopesExtract" />
【讨论】:
谢谢你的重播,其实我想要同一个enpoint地址,【参考方案2】:当我们使用WCF项目模板创建WCF服务时,通常Service.svc(Markup)中只有一个服务宿主。
<%@ ServiceHost Language="C#" Debug="true" Service="WcfService3.Service1" CodeBehind="Service1.svc.cs" %>
这意味着我们可以有多个服务契约,但我们只能有一个服务(服务实现类)。 在这种情况下,在一个项目中托管多个服务合同是有效的。
public class Service1 : IService1,IService2
回到你的问题,这个错误主要是我们的服务有相同的相对地址,这不符合WCF寻址规范。 正如Selim Yıldız 所说,我们需要两个单独的端点地址。
<services>
<service name="WcfService3.Service1">
<endpoint address="a" binding="webHttpBinding" contract="WcfService3.IService1" behaviorConfiguration="rest"></endpoint>
<endpoint address="b" binding="webHttpBinding" contract="WcfService3.IService2" behaviorConfiguration="rest"></endpoint>
</service>
</services>
服务网址将是,
http://xxxx:xx/service1.svc/a/GetAllUsershttp://xxxx:xx/service1.svc/b/GetAllScopes
如果有什么我可以帮忙的,请随时告诉我。
【讨论】:
感谢您的重播,实际上我希望这两次具有相同的端点地址 xxxx:xx/service1.svc/rest/GetAllUsers 和 xxxx:xx/service1.svc/rest/GetAllScopes 事实上,我尝试使用其他解决方案:我创建了两个不同的接口和两个 SVC: * ServiceScopes.svc 和 * DataExtractor.svc 现在运行良好..但通常是创建不同的 svc 吗?或者没关系,谢谢 添加不同的SVC也会导致不同的服务基地址。 xxxx:xx/service1.svcxxxx:xx/service2.svc我们最好在单个服务合约中实现服务,这样才能达到基地址相同的目的。 很清楚!非常感谢,我现在明白了以上是关于一个 WCF 服务中的多个合同_但调用第二个合同时出错的主要内容,如果未能解决你的问题,请参考以下文章
具有多个合同的 Mono WCF 休息服务“配置文件中未定义端点”