尝试启动服务时出现以下错误:
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 中获取生成的引用.cs
这个想法是创建一个"模拟器",因此我们实际上不是调用真正的 WSDL,而是调用模拟器本身并生成我们需要的数据(有点模拟)。
请考虑以下 WSDL 生成的引用.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);
}
}
这是我的应用程序的一部分。
<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 个具有不同协定但具有相同操作的端点的服务的任何数据。
我不清楚"请考虑将这些端点托管在单独的 ListenUri 上"的建议。
主要问题是双服务端点地址不应相同。您提供的配置具有相同的侦听 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 操作命名空间。
简而言之,我们必须更改配置中的服务终结点地址。 如果有什么我可以帮忙的,请随时告诉我。