【问题标题】:Multiple contracts in one WCF service_But error for calling the second contract一个 WCF 服务中的多个合同_但调用第二个合同时出错
【发布时间】: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>

我该如何解决?

谢谢

【问题讨论】:

  • 能否将文本截图转换回纯文本?让其他人更容易搜索相同的问题。
  • 当然可以,

标签: c# rest wcf soapui


【解决方案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/GetAllUsers
http://xxxx:xx/service1.svc/b/GetAllScopes

如果有什么我可以帮忙的,请随时告诉我。

【讨论】:

  • 感谢您的重播,实际上我希望这两次具有相同的端点地址 xxxx:xx/service1.svc/rest/GetAllUsersxxxx:xx/service1.svc/rest/GetAllScopes 事实上,我尝试使用其他解决方案:我创建了两个不同的接口和两个 SVC: * ServiceScopes.svc 和 * DataExtractor.svc 现在运行良好..但通常是创建不同的 svc 吗?或者没关系,谢谢
  • 添加不同的SVC也会导致不同的服务基地址。 xxxx:xx/service1.svcxxxx:xx/service2.svc我们最好在单个服务合约中实现服务,这样才能达到基地址相同的目的。
  • 很清楚!非常感谢,我现在明白了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
相关资源
最近更新 更多