System.ServiceModel.ServiceHost,不能用于通信,因为它处于故障状态

Posted

技术标签:

【中文标题】System.ServiceModel.ServiceHost,不能用于通信,因为它处于故障状态【英文标题】:System.ServiceModel.ServiceHost, cannot be used for communication because it is in the Faulted state 【发布时间】:2013-08-16 07:53:21 【问题描述】:

尝试使用队列时收到此错误:

发生意外错误:通信对象 System.ServiceModel.ServiceHost 无法用于通信,因为它处于故障状态。 在 System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan 超时)

如何克服?

更新:对我在最后发布的解决方案的回答

【问题讨论】:

有机会展示一些代码:) 我解决了,决定发布答案:) 之前在网上没有找到这个解决方案,所以决定分享:) 最好将您的解决方案发布为答案,然后将其标记为答案。这有助于让其他访问此页面的人更清楚。 【参考方案1】:

此问题是由访问权限引起的。使用管理权限启动 Visual Studio,问题将得到解决。 要以管理员权限启动 Visual Studio,请右键单击 Visual Studio 图标并选择“以管理员身份运行”。

【讨论】:

【参考方案2】:

更新:就我而言,有帮助的是:

1) 启用跟踪日志:http://msdn.microsoft.com/en-us/library/ms732023.aspx

2) 在跟踪日志中它写道:

绑定验证失败,因为绑定的 ExactlyOnce 属性设置为 true,而目标队列是非事务性的。服务主机打不开。通过将 ExactlyOnce 属性设置为 false 或为此绑定创建事务队列来解决此冲突。

答案说明了一切。创建了一个事务队列 - 一切正常 :) 希望它可以帮助人们:)

【讨论】:

【参考方案3】:

关闭您的解决方案,现在按照以下步骤操作: 1.右键单击视觉工作室。 2. 单击以管理员身份运行。 3. 现在打开您的解决方案。 4.尝试运行它,您的问题将得到解决。

【讨论】:

【参考方案4】:

根据我的经验,一旦端点处于故障状态,它将无法自行恢复,需要重新启动。没有办法从客户端实现这一点。主人必须这样做。

在主机端,您可以使用如下代码检查故障状态:

  While True
      'broken connection case
      If objServiceHost(ii).State <> CommunicationState.Opened Then
        Throw New Exception("SynchronizationWS Service Host failed.") 
        Exit While
      End If
    Next
    Threading.Thread.Sleep(c_SleepTime) 'sleep 1 second before going trying next
  End While

我们有一个更高级别的程序来监视我们的 Web 服务(在 Windows 服务中运行)的心跳,如果更高级别的程序发现心跳停止,它将回收 Windows 服务,重新启动 WCF Web 服务.

【讨论】:

【参考方案5】:

对我来说,这是因为该端口已被另一个进程使用,我更改了端口并且服务照常工作。我通过跟踪日志知道这一点,只需按照此处的步骤操作:https://docs.microsoft.com/en-us/dotnet/framework/wcf/service-trace-viewer-tool-svctraceviewer-exe

回顾:

    将此部分添加到 web.config 或 app.config 文件中:

    <system.diagnostics>
         <trace autoflush="true" />
         <sources>
                 <source name="System.ServiceModel"
                         switchValue="Information, ActivityTracing"
                         propagateActivity="true">
                 <listeners>
                    <add name="sdt"
                        type="System.Diagnostics.XmlWriterTraceListener"
                        initializeData= "SdrConfigExample.e2e" />
                 </listeners>
              </source>
         </sources>
     </system.diagnostics>
    

    运行 WCF 服务以重现错误。

    打开 SvcTraceViewer.exe 工具,我在以下位置找到它: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin。它将打开 Microsoft 服务跟踪查看器窗口。

    导航到名为“SdrConfigExample.e2e”的日志文件(文件>打开),该文件在上面的 XML 配置中指定,位于根目录中。这将更详细地列出错误,您可以找到异常的原因。

*提示:您可以使用everything tool 在您的计算机上轻松快速地查找文件。

【讨论】:

以上是关于System.ServiceModel.ServiceHost,不能用于通信,因为它处于故障状态的主要内容,如果未能解决你的问题,请参考以下文章