WCF 多端点

Posted

技术标签:

【中文标题】WCF 多端点【英文标题】:WCF multiple endpoints 【发布时间】:2017-10-31 19:40:11 【问题描述】:

我想在多个端点上公开我的 WCF 服务。 我不明白为什么会出现这个错误,因为每个端点都有唯一的地址。

我是否必须为每个单独的端点公开 mex 端点?

错误是:

System.InvalidOperationException:绑定实例已关联到侦听 URI 'http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/'。如果两个端点想要共享同一个 ListenUri,它们也必须共享同一个绑定对象实例。两个冲突的端点要么在 AddServiceEndpoint() 调用中指定,要么在配置文件中指定,要么在 AddServiceEndpoint() 和 config 的组合中指定。 在 System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription 描述,ServiceHostBase 服务主机) 在 System.ServiceModel.ServiceHostBase.InitializeRuntime() 在 System.ServiceModel.ServiceHostBase.OnOpen(时间跨度超时) 在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度超时) 在 Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo 信息)

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfServiceLibrary1

  // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
  [ServiceContract]
  public interface IService1
  
    [OperationContract]
    string GetData(int value);

    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);

    // TODO: Add your service operations here
  

  // Use a data contract as illustrated in the sample below to add composite types to service operations.
  // You can add XSD files into the project. After building the project, you can directly use the data types defined there, with the namespace "WcfServiceLibrary1.ContractType".
  [DataContract]
  public class CompositeType
  
    bool boolValue = true;
    string stringValue = "Hello ";

    [DataMember]
    public bool BoolValue
    
      get  return boolValue; 
      set  boolValue = value; 
    

    [DataMember]
    public string StringValue
    
      get  return stringValue; 
      set  stringValue = value; 
    
  





    namespace WcfServiceLibrary1

  // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together.
  public class Service1 : IService1
  
    public string GetData(int value)
    
      return string.Format("You entered: 0", value);
    

    public CompositeType GetDataUsingDataContract(CompositeType composite)
    
      if (composite == null)
      
        throw new ArgumentNullException("composite");
      
      if (composite.BoolValue)
      
        composite.StringValue += "Suffix";
      
      return composite;
    
  

配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="WcfServiceLibrary1.Service1">        
        <!-- Service Endpoints -->
        <!-- Unless fully qualified, address is relative to base address supplied above -->
        <endpoint address="http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/"
                  binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1" name="first" />

        <endpoint address="http://localhost:8734/Design_Time_Addresses/WcfServiceLibrary1/Service2/"
                  binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1" name="second" />

        <endpoint address="http://localhost:8735/Design_Time_Addresses/WcfServiceLibrary1/Service3/"
                  binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1" name="third" />



        <!-- Metadata Endpoints -->
        <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> 
        <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
        <endpoint address="http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <endpoint address="http://localhost:8734/Design_Time_Addresses/WcfServiceLibrary1/Service2/" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <endpoint address="http://localhost:8735/Design_Time_Addresses/WcfServiceLibrary1/Service3/" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

【问题讨论】:

两个端点(basic 和 mex)不能在同一个地址上。为其中一个(或两个)添加一些特定地址。对你有帮助吗? 我在每个 mexHttpBinding 的末尾添加了 'mex',但错误仍然存​​在。 您是否必须放置多个元数据端点,否则就足够了 它有效 - 我必须设置基地址。 请您发表您的评论作为答案。感谢您的帮助。 【参考方案1】:

我认为这对你有用

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

【讨论】:

以上是关于WCF 多端点的主要内容,如果未能解决你的问题,请参考以下文章

WCF 服务端点无法从本地访问

wcf 端点相对地址

WCF 错误:相对端点地址

WCF:如何从 ServiceHost 获取端点列表?

WCF - 客户端是不是必须具有与端点相同的行为?

测试 WCF - 没有端点监听