4

如何以编程方式更改 web.config 文件中的自定义错误模式?我需要更改以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<configSections />

...

<system.web>
....

<customErrors mode="RemoteOnly">
   <error statusCode="404" redirect="~/errors/404" />
</customErrors>

<customErrors mode="off">
   <error statusCode="404" redirect="~/errors/404" />
</customErrors>

有人对此有任何想法吗?

更新

作为CoDe aDDict 的回答,我尝试使用它:

Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
CustomErrorsSection CustomErrorsection = (CustomErrorsSection)config.GetSection("system.web/customErrors");
CustomErrorsection.Mode = CustomErrorsMode.Off;
config.Save();

但有一个例外:

Access to the path 'D:\Projects\MyProject\web.config' is denied.
4

2 回答 2

3

几天前我发现了一个示例,该示例在自定义错误配置中发生了很大变化

public static void ConfigureCustomErrors()
    {
        Configuration config = 
        WebConfigurationManager.OpenWebConfiguration("~");

        CustomErrorsSection section = 
            (CustomErrorsSection)config.GetSection(
                "system.web/customErrors");

        //Verify that customErrors exists in web.config
        if (section != null)
        {
            //Only configure if customErrors is enabled 
            if (section.Mode != CustomErrorsMode.Off)
            {
                if(!section.IsReadOnly() && 
                    !section.SectionInformation.IsLocked)
                {
                    //Collection of new redirects to add to 
                    //the customErrors element
                    CustomErrorCollection redirectsToAdd = 
                       new CustomErrorCollection();

                    //Page ID of the page to be used for 
                    //custom error redirects
                    int redirectPageId = 0;

                    //Get existing redirects, if any
                    CustomError redirect404 = 
                        section.Errors["404"];
                    CustomError redirect500 = 
                        section.Errors["500"];

                    //Get URL for 404 redirects
                    int.TryParse(
                        ConfigurationManager.AppSettings[
                             "FileNotFoundPageId"], 
                             out redirectPageId);
                    string fileNotFoundURL = 
                        ToolBox.GetSimpleAddress(
                        DataFactory.Instance.GetPage(
                        new PageReference(redirectPageId));

                    //Get URL for server error redirects
                    int.TryParse(
                        ConfigurationManager.AppSettings[
                        "GenericErrorPageId"], 
                        out redirectPageId);
                    string serverErrorURL = 
                        ToolBox.GetSimpleAddress(
                        DataFactory.Instance.GetPage(
                        new PageReference(redirectPageId)));

                    //If the 404 redirect hasn't been 
                    //specified or if its redirect 
                    //URL is invalid
                    if (fileNotFoundURL!=string.Empty && 
                       (redirect404 == null || 
                       redirect404.Redirect!=
                          fileNotFoundURL))
                    {
                        //Add new 
                        if (redirect404 == null)
                        {
                            CustomError fileNotFoundError = 
                            new CustomError(404,
                            fileNotFoundURL);

                            redirectsToAdd.Add(
                               fileNotFoundError);
                        }
                        else //Modify existing
                        {
                            redirect404.Redirect = 
                                fileNotFoundURL;
                        }
                    }

                    //If the 500 redirect hasn't been 
                    //specified or if its redirect 
                    //URL is invalid
                    if (fileNotFoundURL != string.Empty && 
                        (redirect500 == null || 
                        redirect500.Redirect != 
                           fileNotFoundURL))
                    {
                        //Add new 
                        if (redirect500 == null)
                        {
                            CustomError serverError = 
                            new CustomError(500, 
                            serverErrorURL);

                            redirectsToAdd.Add(serverError);
                        }
                        else //Modify existing redirect
                        {
                            redirect500.Redirect = 
                                serverErrorURL;
                        }
                    }

                    //Add any new redirects
                    foreach (
                        CustomError redirectToAdd in 
                        redirectsToAdd)
                    {
                        section.Errors.Add(redirectToAdd);
                    }

                    //Save web.config if its 
                    //contents have changed
                    config.Save();
                }
            }
        }
    }
于 2012-06-26T12:31:35.523 回答
0

为了更新您的 web.config 文件,运行您的应用程序池的进程/身份将需要对 web.config 文件具有修改(写入)访问权限。您收到错误消息,因为您的应用程序没有写入 web.config 文件的权限。添加适当的权限,并且已说明的内容将毫无例外地起作用。现在说了这么多...

免责声明

配置文件驱动您的应用程序,具有应用程序中路径的身份验证/授权信息、用于编码/解码身份验证票证的机器密钥(可能)、SQL 连接字符串等。让您的应用程序可写这些可能是一个令人讨厌的安全问题. 我已作出免责声明。请小心 :)

于 2012-06-26T15:34:52.960 回答