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
пожалуйста, удалите его и повторите попытку.