WCF端点异常

时间:2010-06-05 13:44:31

标签: wcf

我只是尝试使用各种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 个答案:

答案 0 :(得分:2)

您在控制台应用中自托管 - 您的配置如何设置?

  • 您的MySelfHostConsoleApp项目是否有app.config个文件?

  • 您是否MySelfHostConsoleApp.exe.configMySelfHostConsoleApp.exe文件在同一目录中?

错误消息实际上意味着无法找到配置,因此无法解释和使用。

UPDATE:另一个选项是WCF无法解释配置是否存在。

检查出来:

  • 在您的.NET代码中,实现该服务的服务类称为MyServiceLibrary.NameDecorator

  • 但是,在您的配置中,您可以致电您的服务:

    <service name="Lijo.Samples.NameDecorator"
    

那不行!您在这里混合了.NET命名空间和服务命名空间 - 您需要在服务端配置中放置的名称是.NET完全限定类型名称(包括.NET命名空间 - not 服务名称空间!)。

您的服务主机会根据您的代码查找条目<service name="MyServiceLibrary.NameDecorator"> - 但它找不到它。

所以你需要确保同步这两件事 - 完全限定的服务类名称(包括命名空间和所有)必须匹配name="...."中的<service>属性你的配置中的标签。