这是我创建应用程序的代码
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;
}
}
一切正常,直到它发出提交更改方法调用。
它会抛出此错误
错误:无法写入配置文件
除了我将启用的值更改为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");
我现在收到此错误
错误:无法提交配置更改,因为该文件具有 在磁盘上更改
答案 0 :(得分:0)
我还遇到了我们用于配置IIS服务器作为部署操作一部分的c#应用程序的两个问题中的第二个(Error: Cannot commit configuration changes because the file has changed on disk
)。
最后,对于我来说,无意中使用围绕导致问题的ServerManager
对象的语句嵌套了两个。
对于您的特定情况,我会尝试添加using
语句以供您对ServerManager
的引用,并确保命令行appcmd
调用在using语句之外或在使用中移动声明,但通过ServerManager
对象转换为API调用。