问题 “服务X没有应用程序端点”,除非我在代码中添加端点 - 为什么?


我跟着 这篇MSDN文章 彻底创建托管在NT服务中的WCF服务。

当我在服务控制台中单击“开始”时,我在事件查看器中看到以下内容:

服务无法启动。 System.InvalidOperationException:服务'MyServiceNamespace.RequestProcessorImpl'没有应用程序(非基础结构)端点。这可能是因为没有为您的应用程序找到配置文件,或者因为在配置文件中找不到与服务名称匹配的服务元素,或者因为在service元素中没有定义端点。

我试着查看我能找到的所有可能的原因。这是App.Config文件中的服务描述:

 <service name="MyServiceNamespace.RequestProcessorWindowsService"
           behaviorConfiguration="RequestProcessorServiceBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8095/RequestProcessorService"/>
      </baseAddresses>
    </host>
    <endpoint address= ""
              binding="wsHttpBinding"
              contract="MyServiceNamespace.IRequestProcessor" />
    <endpoint address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange" />
  </service>

所有实体都是 用他们的命名空间命名,这不是问题所在。 App.Config文件放在bin \ Debug中 - 正好是NT服务的起始位置。

但是当我改变我的时候 ServiceBase 后裔 OnStart() 从最初的实施:

public class RequestProcessorWindowsService : ServiceBase {
    public ServiceHost serviceHost = null;
    //other methods skipped 
    protected override void OnStart(string[] args)
    {
        if( serviceHost != null ) {
       serviceHost.Close();
        }
        serviceHost = new ServiceHost( typeof(RequestProcesssorImpl) );
        serviceHost.Open();
    }
}

以下一个,以便它调用 AddServiceEndpoint() 服务开始没问题(但是我无法添加对它的引用,所以我猜其他问题出现了):

public class RequestProcessorWindowsService : ServiceBase {
    public ServiceHost serviceHost = null;
    //other methods skipped 
    protected override void OnStart(string[] args)
    {
        if( serviceHost != null ) {
       serviceHost.Close();
        }
        Uri baseAddress = new Uri("http://localhost:8095/RequestProcessorService");
        serviceHost = new ServiceHost( typeof(RequestProcesssorImpl), baseAddress );
        serviceHost.AddServiceEndpoint( typeof(IRequestProcessor), new BasicHttpBinding(), baseAddress );
        serviceHost.Open();
    }
}

为什么我的服务在通过App.Config配置时没有启动?


11758
2018-03-11 09:09


起源

你可以发布错误抛出相同的OnStart()吗? - Vincent Vancalbergh
@Vincent Vancalbergh:做完了。 - sharptooth


答案:


配置文件中的服务名称与服务实现类不匹配。

配置文件应包含:

<service name="MyServiceNamespace.RequestProcesssorImpl"

15
2018-03-11 09:57



好的,我尝试了它,它完全解决了我的问题,我甚至可以从另一个项目添加对我的WCF服务的引用。非常感谢你。 - sharptooth
始终把类实现服务合同。从WCF主机的角度来看,它是唯一重要的一个。 - Johann Blais
+1指出这个:) - Jeroen Landheer
谢谢,你的第一个实际上只是说需要做什么:)。 stackoverflow.com/questions/9814281/... - eran otzap