一个 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&amp;
        addressMatched)
        at System.ServiceModel.Dispatcher.EndpointDispatcherTable.Lookup(Message message, Boolean&amp;
        addressMatched)
        at System.ServiceModel.Dispatcher.ChannelHandler.GetDatagramChannel(Message message, EndpointDispatcher&amp;
        endpoint, Boolean&amp; 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 休息服务“配置文件中未定义端点”

可移植/可互操作的 WCF 合同

wcf 决策:一项服务多项合同或多项服务

同一端点(svc 文件)上的两个休息式 WCF 合同

WCF IIS 托管服务由单个服务实现的多个服务合同 - 如何通过配置在端点之间共享 uri

版本化服务合同后无法访问 WCF 服务