在ASP.NET MVC 3中以编程方式更改Web配置中的自定义错误模式

时间:2012-06-26 12:26:34

标签: asp.net asp.net-mvc asp.net-mvc-3 web-config

如何以编程方式更改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.

2 个答案:

答案 0 :(得分:3)

I found an example some days ago which change alot in custom error configration

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();
                }
            }
        }
    }

答案 1 :(得分:0)

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

<强>声明

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