wcf - 如何处理具有共享相同操作的多个端点的服务

问题描述 投票:0回答:1

尝试启动我的服务时出现以下错误:

Could not start the Service: System.InvalidOperationException: This service has multiple endpoints listening at 'https://b2e.my.loc:8093/' which share the same initiating action 'http://localhost:8080/kestrel/AirService'.  As a result, messages with this action would be dropped since the dispatcher would not be able to determine the correct endpoint for handling the message.  Please consider hosting these Endpoints at separate ListenUris.

我们得到了一个使用第三方WSDL的应用程序,以便搜索和预订航班。

我们有另一个winform应用程序,它从上面的wsdl获取生成的reference.cs

我的想法是创建一个“模拟器”,所以不是调用真正的WSDL,而是实际调用模拟器本身并生成我们需要的数据(有点模仿)

考虑WSDL生成的以下reference.cs文件:

namespace FlightWCF
{
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace = "", ConfigurationName = "FlightWCF.ISearch")]
    public interface ISearch
    {
        [System.ServiceModel.OperationContractAttribute(Action = "http://localhost:8080/kestrel/AirService", ReplyAction = "*")]
        FlightWCF.serviceResponse1 service(FlightWCF.serviceRequest1 request);
    }


    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace = "", ConfigurationName = "FlightWCF.IReserve")]
    public interface IReserve
    {
        [System.ServiceModel.OperationContractAttribute(Action = "http://localhost:8080/kestrel/AirService", ReplyAction = "*")]
        FlightWCF.serviceResponse6 service(FlightWCF.serviceRequest6 request);
    }   
}

这是我的app.config的一部分

<service name="MyFlightClass.ServiceFlight">
    <endpoint address="" binding="basicHttpBinding"  bindingConfiguration="basicSecureHttpBindingConfiguration" contract="FlightWCF.ISearch" />
    <endpoint address="" binding="basicHttpBinding"  bindingConfiguration="basicSecureHttpBindingConfiguration" contract="FlightWCF.IReserve" />
</service>

这是使用上述代码的服务:

namespace MyFlightClass
{

    class  ServiceFlight :  ISearch, IReserve
    {
        public FlightWCF.serviceResponse1 service(FlightWCF.serviceRequest1 request)
        {
            //DO SOMETHING
        }

        public FlightWCF.serviceResponse6 service(FlightWCF.serviceRequest6 request)
        {
            //DO SOMETHING
        }
    }
}

问题是两个服务都使用相同的“动作”。

如果我改变一个人的“行动”,它就变得无法到达。

我找不到任何关于如何使用具有不同合同但具有相同操作的2个端点配置服务的数据。

我不清楚“请考虑在单独的ListenUris上托管这些端点”的建议。

wcf wcf-endpoint
1个回答
0
投票

主要问题是双服务端点地址不应相同。您提供的配置具有相同的侦听Uri。

<service name="MyFlightClass.ServiceFlight">
    <endpoint address="" binding="basicHttpBinding"  bindingConfiguration="basicSecureHttpBindingConfiguration" contract="FlightWCF.ISearch" />
    <endpoint address="" binding="basicHttpBinding"  bindingConfiguration="basicSecureHttpBindingConfiguration" contract="FlightWCF.IReserve" />
</service>

因此,由于操作名称重复,因此操作具有相同的命名空间。但SOAP消息将根据soap操作命名空间发送到正确的端点。 简而言之,我们必须更改配置中的服务端点地址。如果有什么我可以帮忙,请随时告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.