尝试从 C# 服务查询 IIS 时出现异常
Posted
技术标签:
【中文标题】尝试从 C# 服务查询 IIS 时出现异常【英文标题】:Exception while trying to query IIS from C# service 【发布时间】:2013-03-25 23:53:38 【问题描述】:我从用 C# 编写的 Windows 服务调用以下代码:
try
ServerManager m = new ServerManager();
if(m != null)
SiteCollection sites = m.Sites; //I get exception here
catch (Exception ex)
我得到了这个例外:
"文件名:redirection.config\r\n错误:无法读取配置 文件\r\n\r\n":null
这是什么意思?有什么方法可以在 ServerManager 或我的 m
变量中预测它,然后再抛出它?
【问题讨论】:
可能重复 [***.com/questions/5615296/… [1]: ***.com/questions/5615296/… @Artru:这不是一个 ASP.NET 项目。我从 Windows 服务调用它。 【参考方案1】:更新:在查看您的评论后,我现在可以完全回答问题,问题是您的应用程序引用了错误的 Microsoft.Web.Administration.dll,看到错误告诉我您正在引用IIS Express 版本,而不是“完整”IIS 版本 (7.0.0.0)。因此,请修改您的应用程序代码以添加对 c:\windows\system32\inetsrv\Microsoft.Web.Administration.dll 中的引用的引用。
这是一个权限问题。
您需要确保以管理员组或 SYSTEM 成员身份运行 Windows 服务。我的猜测是您可能将服务作为本地服务或网络服务运行,而那些无权读取位于 %windows%\system32\inetsrv\config 中的配置文件。
其他信息: Redirection.config 是 IIS 用来确定是应该从正常路径 (%windir%\system32\inetsrv\config\applicationHost.config) 读取其配置还是应该在集中配置时从外部 UNC 文件共享中读取它的文件用于许多服务器。这就是为什么这是第一个要解析的文件之一,因此您会收到该特定文件的访问被拒绝错误。
关于预测,最好的办法是在 try/catch 中创建它并处理它。读取配置时可能会发生许多异常,例如权限(您可以通过确保您可以读取(例如 File.OpenText())到 Redirection.config、ApplicationHost.config in %windir%\system32\inetsrv 来预测这一点\config 但这是猜测,还有其他一些问题,例如访问密码的加密密钥、无效的配置等)
【讨论】:
感谢您的回答。我检查了我的服务安装为process.Account = ServiceAccount.LocalSystem;
我还在任务管理器中检查了它的进程,它作为 SYSTEM 作为 64 位进程运行。正如您指出的那样,我还检查了applicationHost.config
文件,它在那里并且似乎是一个常规的xml文件。
事实上,redirection.config 和 applicationHost.config 都是简单的 XML 文件。此时我建议使用 ProcMon 查看导致问题的文件,您可能会在那里看到问题
谢谢。尝试在我的服务上运行 ProcMon,但我究竟需要从中获得什么?它输出大量信息......
查看 ProcMon 的输出后,由于某种原因,它尝试 CreateFile C:\Windows\system32\config\systemprofile\Documents\IISExpress\config\redirection.config
并失败。知道这意味着什么吗?
现在查看您的评论后,我可以完全回答问题,问题是您的应用程序引用了错误的 Microsoft.Web.Administration.dll,看到错误告诉我您引用的是 IIS Express 版本(可能是 7.9.0.0 左右)而不是“完整”的 IIS 版本(7.0.0.0)。因此,请修改您的应用程序代码以添加对 c:\windows\system32\inetsrv\Microsoft.Web.Administration.dll 中的引用的引用。以上是关于尝试从 C# 服务查询 IIS 时出现异常的主要内容,如果未能解决你的问题,请参考以下文章
从 docker 连接到 office365 SMTP 时出现异常
尝试从 WinJS 读取 C# WinRT 组件中的空字符串时出现异常
从 C# 调用 WebApi 获取异常 HttpRequestException
在配置单元中发出选择查询时出现异常'java.lang.IllegalArgumentException(无法从空字符串创建路径)'