Исключение конечной точки WCF - PullRequest
2 голосов
/ 05 июня 2010

Я просто пытаюсь использовать различные сценарии WCF (в .Net 3.0).

Я использую собственный хостинг.

Я получаю исключение, так как «Служба« MyServiceLibrary.NameDecorator »не имеет конечных точек приложения (не инфраструктуры). Это может быть связано с тем, что для вашего приложения не найден файл конфигурации или потому, что не может быть никакого элемента службы, соответствующего имени службы найден в файле конфигурации или потому что в элементе службы не определены конечные точки. "

У меня есть файл конфигурации следующим образом (который имеет конечную точку)

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

  <system.serviceModel>
    <services>

      <service name="Lijo.Samples.NameDecorator"
               behaviorConfiguration="WeatherServiceBehavior">

        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8010/ServiceModelSamples/FreeServiceWorld"/>
          </baseAddresses>
        </host>

        <endpoint address=""
                  binding="wsHttpBinding"
                  contract="Lijo.Samples.IElementaryService" />
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WeatherServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

И Хост как

using System.ServiceModel;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.Runtime.Serialization;

namespace MySelfHostConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            System.ServiceModel.ServiceHost myHost = new ServiceHost(typeof(MyServiceLibrary.NameDecorator));
            myHost.Open(); 
            Console.ReadLine();
        }
    }


}

Мой сервис выглядит следующим образом

using System.ServiceModel;
using System.Runtime.Serialization;

namespace MyServiceLibrary
{
    [ServiceContract(Namespace = "http://Lijo.Samples")]
    public interface IElementaryService
    {
        [OperationContract]
        CompanyLogo GetLogo();
    }

    public class NameDecorator : IElementaryService
    {
        public CompanyLogo GetLogo()
        {

            CircleType cirlce = new CircleType();
            CompanyLogo logo = new CompanyLogo(cirlce);
            return logo;
        }
    }

    [DataContract]
    public abstract class IShape 
    {
        public abstract string SelfExplain();

    }

    [DataContract(Name = "Circle")]
    public class CircleType : IShape 
    {
        public override string SelfExplain()
        {
            return "I am a Circle";
        }
    }

    [DataContract(Name = "Triangle")]
    public class TriangleType : IShape
    {
        public override string SelfExplain()
        {
            return "I am a Triangle";
        }
    }

    [DataContract]
    [KnownType(typeof(CircleType))]
    [KnownType(typeof(TriangleType))]
    public class CompanyLogo
    {
        private IShape m_shapeOfLogo;

        [DataMember]
        public IShape ShapeOfLogo
        {
            get
            {
                return m_shapeOfLogo;
            }
            set
            {
                m_shapeOfLogo = value;
            }
        }

        public CompanyLogo(IShape shape)
        {
            m_shapeOfLogo = shape;
        }
    }

}

Не могли бы вы помочь мне понять, чего мне здесь не хватает?

Спасибо

Lijo

1 Ответ

2 голосов
/ 05 июня 2010

Вы самостоятельно размещаетесь в консольном приложении - как настроен ваш конфигурационный файл?

  • Есть ли в вашем MySelfHostConsoleApp проекте файл app.config?

  • У вас есть MySelfHostConsoleApp.exe.config в том же каталоге, что и файл MySelfHostConsoleApp.exe?

Сообщение об ошибке просто означает, что конфигурация не может быть найдена и, следовательно, не может быть интерпретирована и использована.

ОБНОВЛЕНИЕ: другой вариант заключается в том, что WCF не может интерпретировать конфигурацию, если она присутствует.

Проверьте это:

  • в вашем коде .NET ваш класс обслуживания, который реализует службу, называется MyServiceLibrary.NameDecorator

  • однако в вашем конфиге вы вызываете свой сервис:

    <service name="Lijo.Samples.NameDecorator"
    

Это не сработает! Вы смешиваете здесь пространства имен .NET и пространства имен службы - и имя, которое необходимо указать в конфигурации службы, - это полное имя типа .NET (включая пространство имен .NET - , а не ). пространство имен службы!).

Ваш сервисный хост будет искать запись <service name="MyServiceLibrary.NameDecorator"> на основе вашего кода - но не найдет ее.

Поэтому вам нужно убедиться, что эти две вещи синхронизированы - полное имя класса обслуживания (включая пространство имен и все) ДОЛЖЕН соответствовать атрибуту name="...." в вашем теге <service> в вашей конфигурации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...