ServerManager.CommitChanges()抛出错误:"不能写配置文件"
本文关键字:quot 不能 配置文件 错误 CommitChanges 出错 ServerManager | 更新日期: 2023-09-27 18:08:53
下面是我创建一个应用程序的代码
public static bool CreateApplication(String websiteName, String applicationName, String AppDIR,String appPoolName)
{
try
{
var windowsDir = Environment.GetEnvironmentVariable("SystemRoot");
Process.Start(windowsDir+@"'system32'inetsrv'appcmd","unlock config -section:system.webServer/security/authentication/windowsAuthentication");
Process.Start(windowsDir+@"'system32'inetsrv'appcmd","unlock config -section:system.webServer/security/authentication/anonymousAuthentication");
ServerManager iisManager = new ServerManager();
if (!applicationName.Contains("/"))
applicationName = "/" + applicationName;
var app = iisManager.Sites[websiteName].Applications.Add(applicationName, AppDIR);
app.ApplicationPoolName = appPoolName;
var config = app.GetWebConfiguration();
var anonsection = config.GetSection("system.webServer/security/authentication/anonymousAuthentication", iisManager.Sites[websiteName].Name + applicationName);
anonsection["enabled"] = false;
var winsection = config.GetSection("system.webServer/security/authentication/windowsAuthentication", iisManager.Sites[websiteName].Name + applicationName);
winsection["enabled"] = true;
iisManager.CommitChanges(); //Blows up here
return true;
}
catch
{
return false;
}
}
一切都很好,直到它碰到commit changes方法调用。
抛出这个错误
错误:Cannot write configuration file
所有的代码都被验证为工作,除了我将启用值更改为false和true。
当我加入这些的时候,它开始爆炸。
有没有办法从代码中修复这个问题,可以分发到其他机器?
更新:
重新锁定文件后
这样的 Process.Start(windowsDir + @"'system32'inetsrv'appcmd", "lock config -section:system.webServer/security/authentication/windowsAuthentication");
Process.Start(windowsDir + @"'system32'inetsrv'appcmd", "lock config -section:system.webServer/security/authentication/anonymousAuthentication");
我现在得到这个错误
错误:无法提交配置更改,因为文件有磁盘更改
对于我们的c#应用程序,我也遇到了第二个问题(Error: Cannot commit configuration changes because the file has changed on disk
),我们使用它来配置IIS服务器,作为我们部署操作的一部分。
对我来说,最后是无意中嵌套了两个using语句,包裹在ServerManager
对象周围,导致了这个问题。
对于您的特定情况,我会尝试添加using
语句以供您参考ServerManager
,并确保命令行appcmd
调用在using语句之外或在using语句中移动,但通过ServerManager
对象转换为API调用。