【问题标题】:Error 0xc00e0003 in MSMQ + WCF inside a Windows ServiceWindows 服务内的 MSMQ + WCF 中的错误 0xc00e0003
【发布时间】:2014-11-11 07:50:39
【问题描述】:

我在 Windows 服务中托管使用​​ MSMQ 的 WCF 服务。

问题:

安装服务后,无法启动服务。事件日志有以下信息:

服务无法启动。 System.InvalidOperationException:打开队列时出错。确保 MSMQ 已安装并正在运行,队列存在并且具有适当的读取权限。

内部异常可能包含附加信息。 ---> System.ServiceModel.MsmqException:打开时出错 队列:无法识别的错误 -1072824317 (0xc00e0003)。消息不能 从队列中发送或接收。确保已安装 MSMQ 并且 跑步。还要确保队列可以使用 所需的访问模式和授权。在 System.ServiceModel.Channels.MsmqQueue.OpenQueue() 在 System.ServiceModel.Channels.MsmqQueue.GetHandle() 在 System.ServiceModel.Channels.MsmqQueue.SupportsAccessMode(字符串 formatName, Int32 accessType, MsmqException& msmqException) --- 结束 内部异常堆栈跟踪 --- 在 System.ServiceModel.Channels.MsmqVerifier.VerifyReceiver(MsmqReceiveParameters 接收参数,Uri listenUri)在 System.ServiceModel.Channels.MsmqTransport...

注意:

  1. Windows 服务可以创建队列,但无法打开它进行读/写。
  2. windows 服务正在 LocalSystem 权限下运行。
  3. SYSTEM 对队列具有完全访问权限。

研究

  1. 根据MSDN 说:

MQ_ERROR_QUEUE_NOT_FOUND (0xC00E0003)

消息队列找不到队列时返回。这样的队列 包括未在目录服务中注册的公共队列和 MSMQ 命名空间中不存在的 Internet 队列。这个错误是 当用户没有足够的权限时也会返回 执行操作。

这是不可能的,因为队列确实存在(它在前一行代码中创建它)并且拥有所有权限。

  1. 访问了Google首页中的所有站点。都试过了,还是一样的例外。

我的 App.Config 文件

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.13.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>
  </configSections>
  <!-- Log4net Logging Setup -->
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
      <file value="D:\\FTPFileUpload.txt"/>
      <appendToFile value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="0"/>
      <maximumFileSize value="10MB"/>
      <staticLogFileName value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %message%newline"/>
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="INFO"/>
        <levelMax value="FATAL"/>
      </filter>
    </appender>
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="RollingFileAppender"/>
    </root>
  </log4net>
  <appSettings>
    <add key="QueueName" value=".\private$\ftpuploader"/>
  </appSettings>
  <system.serviceModel>
    <diagnostics performanceCounters="All"/>
    <services>
      <service name="FTPUploader.Core.FtpUpload" behaviorConfiguration="msmqBehavior">
        <endpoint name="msmq" address="MsmqWcfFtpUpload" binding="netMsmqBinding" bindingConfiguration="msmqFileUploader" contract="FTPUploader.Contracts.IFtpUpload"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.msmq://localhost/private"/>
            <add baseAddress="http://localhost:9271"/> <!-- Hardy-Ramanujan's Number, Reversed!-->
          </baseAddresses>
        </host>
      </service>
    </services>
    <bindings>
      <netMsmqBinding>
        <binding name="msmqFileUploader" exactlyOnce="false">
          <security mode="None"/>
        </binding>
      </netMsmqBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="msmqBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

【问题讨论】:

    标签: c# wcf windows-services msmq


    【解决方案1】:

    好吧,我找到了解决问题的方法。

    问题是“localhost”这个词不能在 Active Directory 系统中正常工作。所以你必须明确说明你的机器名称。

    <?xml version="1.0"?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.13.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>
      </configSections>
      <!-- Log4net Logging Setup -->
      <log4net>
        <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
          <file value="D:\\FTPFileUpload.txt"/>
          <appendToFile value="true"/>
          <rollingStyle value="Size"/>
          <maxSizeRollBackups value="0"/>
          <maximumFileSize value="10MB"/>
          <staticLogFileName value="true"/>
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %level %logger - %message%newline"/>
          </layout>
          <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="INFO"/>
            <levelMax value="FATAL"/>
          </filter>
        </appender>
        <root>
          <level value="DEBUG"/>
          <appender-ref ref="RollingFileAppender"/>
        </root>
      </log4net>
      <appSettings>
        <add key="QueueName" value=".\private$\ftpuploader"/>
      </appSettings>
      <system.serviceModel>
        <diagnostics performanceCounters="All"/>
        <services>
          <service name="FTPUploader.Core.FtpUpload" behaviorConfiguration="msmqBehavior">
            <endpoint name="msmq" address="MsmqWcfFtpUpload" binding="netMsmqBinding" bindingConfiguration="msmqFileUploader" contract="FTPUploader.Contracts.IFtpUpload"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            <host>
              <baseAddresses>
                <add baseAddress="net.msmq://MachineName/private"/> <!-- MachineName instead of localhost -->
                <add baseAddress="http://MachineName:9271"/> <!-- Hardy-Ramanujan's Number, Reversed!--> <!-- MachineName instead of localhost -->
              </baseAddresses>
            </host>
          </service>
        </services>
        <bindings>
          <netMsmqBinding>
            <binding name="msmqFileUploader" exactlyOnce="false">
              <security mode="None"/>
            </binding>
          </netMsmqBinding>
        </bindings>
        <behaviors>
          <serviceBehaviors>
            <behavior name="msmqBehavior">
              <serviceMetadata httpGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 2011-01-10
      • 2010-12-01
      • 2011-10-17
      • 2011-12-26
      • 2015-08-10
      • 1970-01-01
      相关资源
      最近更新 更多