我只是尝试使用各种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
答案 0 :(得分:2)
您在控制台应用中自托管 - 您的配置如何设置?
您的MySelfHostConsoleApp
项目是否有app.config
个文件?
您是否MySelfHostConsoleApp.exe.config
与MySelfHostConsoleApp.exe
文件在同一目录中?
错误消息实际上意味着无法找到配置,因此无法解释和使用。
UPDATE:另一个选项是WCF无法解释配置是否存在。
检查出来:
在您的.NET代码中,实现该服务的服务类称为MyServiceLibrary.NameDecorator
但是,在您的配置中,您可以致电您的服务:
<service name="Lijo.Samples.NameDecorator"
那不行!您在这里混合了.NET命名空间和服务命名空间 - 您需要在服务端配置中放置的名称是.NET完全限定类型名称(包括.NET命名空间 - not 服务名称空间!)。
您的服务主机会根据您的代码查找条目<service name="MyServiceLibrary.NameDecorator">
- 但它找不到它。
所以你需要确保同步这两件事 - 完全限定的服务类名称(包括命名空间和所有)必须匹配name="...."
中的<service>
属性你的配置中的标签。