通过 Windows 服务托管 WCF 服务库获得 System.InvalidOperationException:尝试启动 WCF 服务

Posted

技术标签:

【中文标题】通过 Windows 服务托管 WCF 服务库获得 System.InvalidOperationException:尝试启动 WCF 服务【英文标题】:Hosting a WCF Service Lib through a Windows service get a System.InvalidOperationException: attempting to start WCF Service 【发布时间】:2011-02-11 12:15:49 【问题描述】:

我有一个包含五个服务合同的 WCF 服务库。该库通过 Windows 服务托管。我对 WCF 库的大多数配置(如果不是全部的话)都是声明性的。我在配置代码中唯一要做的就是将实现服务合同的类的类型传递给 ServiceHost。然后,我在 Windows Service OnStart 事件期间对每个服务调用 Open。这是我收到的错误消息:

服务无法启动。 System.InvalidOperationException:服务“[Fubu.Conversion.Service1”的应用程序(非基础设施)端点为零。这可能是因为找不到您的应用程序的配置文件,或者因为在配置文件中找不到与服务名称匹配的服务元素,或者因为在服务元素中没有定义端点。 在 System.ServiceModel.Description.DispatcherBuilder.EnsureThereAreNonMexEndpoints(ServiceDescription 描述) 在 System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription 描述,ServiceHostBase 服务主机) 在 System.ServiceModel.ServiceHostBase.InitializeRuntime() 在 System.ServiceModel.ServiceHostBase.OnBeginOpen() 在 System.ServiceModel.ServiceHostBase.OnOpen(时间跨度超时) 在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度超时) 在 System.ServiceModel.Channels.CommunicationObject.Open() 在 Fubu.RemotingHost.RemotingHost.StartServ...

    protected override void OnStart(string[] args)
    
        // Uncomment to debug this properly
        //System.Diagnostics.Debugger.Break();
        StartService1();
        StartService2();
        StartService3();
        StartService4();
        StartService5();
    

上述每一项都只需执行以下操作:

    private void StartSecurityService()
    
        host = new ServiceHost(typeof(Service1));
        host.Open();
    

Service Lib app.config 总结

<services>
  <service behaviorConfiguration="DefaultServiceBehavior" name="Fubu.Conversion.Service1">
    <endpoint address="" binding="netTcpBinding" bindingConfiguration="TCPBindingConfig"
      name="Service1" bindingName="TCPEndPoint" contract="Fubu.Conversion.IService1">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
      name="mexSecurity" bindingName="TcpMetaData" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8025/Fubu/Conversion/Service1/" />
      </baseAddresses>
    </host>
  </service>

...

合约设置如下: 命名空间 Fubu.Conversion.Service1

[ServiceContract(Namespace = "net.tcp://localhost:8025/Fubu")]
public interface IService1

我一直在寻找“高低”的解决方案,但没有任何运气。答案很明显吗?对此的解决方案似乎不是。谢谢

【问题讨论】:

【参考方案1】:

原因很简单!!! 正如我在问题的解释中所指出的,我在 Windows 服务中托管了一个 WCF 服务库。我在 WCF 服务库项目中错误地定义和定位了 app.config 文件。我确保 app.config 文件始终输出到构建时的 bin 文件夹。一旦我将此配置文件重新定位或复制到 Windows 服务项目,问题就解决了,所有 5 个服务都正确启动。另一点需要注意的是确保为各个服务定义的端点正在使用唯一的端口。

故事的寓意: "确保在将托管您的服务库的项目中定义并找到 app.config 文件。

【讨论】:

以上是关于通过 Windows 服务托管 WCF 服务库获得 System.InvalidOperationException:尝试启动 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

在作为 Windows 服务托管的 WCF 类库项目中使用 SqlDependency

是否可以通过 httpwebrequest 使用 WCF 服务(托管为 Windows 服务托管)?

我可以在 Windows 服务中托管(自托管)WCF 服务并通过 http 公开它吗?

使用移动设备访问托管在 Windows 服务中的 WCF 服务

Windows 服务与托管 WCF 服务

IIS托管WCF服务:集成测试和代码覆盖