2017-05-31 115 views
1

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

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

错误是:

System.InvalidOperationException:有约束力的实例已经关联到听URI 'http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/'。如果两个端点想要共享相同的ListenUri,则它们也必须共享相同的绑定对象实例。两个冲突的端点是在AddServiceEndpoint()调用,配置文件或AddServiceEndpoint()和config的组合中指定的。 在System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription描述,ServiceHostBase的ServiceHost) 在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> 
+2

两个端点(基本和MEX)不能在同一个地址。为其中一个(或两个)添加一些特定的地址。它对你有帮助吗? –

+0

我在每个mexHttpBinding的末尾添加了'mex',但错误仍然存​​在。 – FrenkyB

+0

您是否必须放置多个元数据终结点或这是简单的<端点地址=“mex”绑定=“mexHttpBinding”合同=“IMetadataExchange”/> –

回答

1

我认为这会为你工作

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