【发布时间】: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...
注意:
- Windows 服务可以创建队列,但无法打开它进行读/写。
- windows 服务正在 LocalSystem 权限下运行。
-
SYSTEM对队列具有完全访问权限。
研究
- 根据MSDN 说:
MQ_ERROR_QUEUE_NOT_FOUND (0xC00E0003)
消息队列找不到队列时返回。这样的队列 包括未在目录服务中注册的公共队列和 MSMQ 命名空间中不存在的 Internet 队列。这个错误是 当用户没有足够的权限时也会返回 执行操作。
这是不可能的,因为队列确实存在(它在前一行代码中创建它)并且拥有所有权限。
- 访问了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