WCF InvalidOperationException: экземпляр привязки уже был связан для прослушивания URI

Я новичок в WCF, и я учусь в Essential WCF.

я столкнулся с проблемой при использовании пространства имен и имени ServiceContract. когда я запускаю код, я ловлю ниже InvalidOperationException. Но я не мог ясно понять.

экземпляр привязки уже был связан для прослушивания URI 'http://localhost:8080/NamespaceChange01". Если две конечные точки хотят использовать один и тот же ListenUri, они также должны использовать один и тот же экземпляр объекта привязки. Этот два противоречивых точек указан в AddServiceEndpoint() вызовы, в файле config или сочетание AddServiceEndpoint() и config.

кто-нибудь знает, как avide исключение InvalidOperationException ?

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

namespace NamespaceChange01
{

    [ServiceContract(Name = "MyServiceName", Namespace = "http://ServiceNamespace")]
    public interface IBurgerMaster
    {
        [return: MessageParameter(Name = "myOutput")]
        [OperationContract(Name = "OperationName", Action = "OperationAction", ReplyAction = "ReplyActionName")]
        double GetStockPrice(string ticker);
    }

    [ServiceBehavior(Namespace = "http://MyService")]
    public class BurgerMaster : IBurgerMaster
    {

        public double GetStockPrice(string ticker)
        {
            return 100.99;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(BurgerMaster));
            host.Open();
            Console.ReadLine();
            host.Close();
        }
    }
}
  • app.config

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <services>
          <service name="NamespaceChange01.BurgerMaster" behaviorConfiguration="mexServiceBehavior">
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8080/NamespaceChange01"/>
              </baseAddresses>
            </host>
            <endpoint name="basic" binding="basicHttpBinding" contract="NamespaceChange01.IBurgerMaster"/>
            <endpoint name="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="mexServiceBehavior">
              <serviceMetadata httpGetEnabled="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>
    

спасибо.

3 ответов


две конечные точки (basic и mex) не могут находиться по одному адресу. Добавьте определенный адрес для одного из них (или для обоих).

например:

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

вы пропускаете адрес атрибут из конечной точки метаданных:

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

без него WCF думает, что вы хотите разместить конечную точку mex по тому же адресу.


при создании класса обслуживания почему вы отметили его атрибутом ServiceContract, как говорит ваш код?

[ServiceBehavior(Namespace = "http://MyService")]
public class BurgerMaster : IBurgerMaster

пожалуйста, удалите его и повторите попытку.