2010-06-05 3 views
2

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

Я использую самостоятельный хостинг.

Я получаю исключение, поскольку «Служба« 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

ответ

2

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

  • ли ваш проект 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> тег в вашей конфигурации.

+0

Привет, Marc. В проекте Hsot добавлен app.config и в bin \ Debug создается «MySelfHostConsoleApp.exe.config». Тем не менее я получаю исключение. – Lijo

+0

@ Lijo: Обновлен мой ответ - попробуйте это. –

+1

Спасибо, Марк. Я получил новое образование. - «Имя службы» в app.config - это имя класса, которое реализует контракт, с его пространством имен. Он не связан с пространством имен контракта. – Lijo