Ошибка файла Web.config

#c# #asp.net #web-hosting #web-deployment

#c# #asp.net #веб-хостинг #веб-развертывание

Вопрос:

Я размещаю сайт через godaddy.com и это ссылка:

http://floridaroadrunners.com/

и это мой файл web.config:

  <?xml version="1.0"?>

<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>
  <connectionStrings>
    <add name="ApplicationServices"
         connectionString="data source=.SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />

    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>

<customErrors mode="Off"/>

    <membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
             applicationName="/" />
      </providers>
    </membership>

    <profile>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
      </providers>
    </profile>

    <roleManager enabled="false">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
      </providers>
    </roleManager>

  </system.web>

  <system.webServer>
     <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>
  

Я получаю ошибку времени выполнения:

Ошибка времени выполнения

Описание: На сервере произошла ошибка приложения. Текущие пользовательские настройки ошибки для этого приложения не позволяют просматривать детали ошибки приложения удаленно (по соображениям безопасности). Однако это может быть просмотрено браузерами, работающими на локальном сервере.

Я также установил режим customErrors = «выкл». Что здесь не так? Я использую Visual Studio 2010 с платформой 4.0 в нем. Спасибо!

Комментарии:

1. Вы уверены, что ошибка customErrors off зафиксирована на сервере? Вы должны увидеть ошибку, если режим действительно выключен.

2. Когда со мной возникает такая ситуация, это всегда происходит из-за ошибки в самом формате web.config, из-за которой конфигурация не может быть проанализирована. То, что вы опубликовали, выглядит нормально, поэтому я не знаю…

Ответ №1:

Если ваш хост включил customErrors , вы могли бы рассмотреть возможность самостоятельного обнаружения и регистрации исключения, чтобы вы могли видеть, что происходит.

Есть пара вариантов. Сначала попробуйте Elmah

Во-вторых, вы могли бы использовать свою библиотеку ведения журнала (мне нравится NLog, но подойдет любая) и перехватить событие Application_Error в Global.asax.cs.

 protected void Application_Error(object sender, EventArgs e)
        {
            //first, find the exception.  any exceptions caught here will be wrapped
            //by an httpunhandledexception, which doesn't realy help us, so we'll
            //try to get the inner exception
            Exception exception = Server.GetLastError();
            if (exception.GetType() == typeof(HttpUnhandledException) amp;amp; exception.InnerException != null)
            {
                exception = exception.InnerException;
            }

            //get a logger from the container
            ILogger logger = ObjectFactory.GetInstance<ILogger>();
            //log it
            logger.FatalException("Global Exception", exception);
        }
  

Это хорошая функция, которую нужно иметь, несмотря ни на что, даже если вы можете отключить customErrors.

Комментарии:

1. Хороший совет использовать Elmah! Просто nuget установит elmah.

Ответ №2:

machine.config Или applicationHost.config сервер, скорее всего, переопределяет ваши web.config настройки. К сожалению, вы действительно ничего не можете сделать, если это так, за исключением обращения в службу поддержки GoDaddy.

Комментарии:

1. Это правда, но было бы странно, если бы сценарий совместного хостинга блокировал этот конкретный параметр конфигурации.

2. С их стороны это звучит немного драконовски. Я не использую их для хостинга, поэтому не могу подтвердить или опровергнуть это.

3. Я не использую их в настоящее время и никогда ими не пользовался; я просто прихожу к выводу, который имеет наибольший смысл, без особых размышлений об их политике.

Ответ №3:

Значение mode Off customErrors чувствительно к регистру, я думаю. Пожалуйста, убедитесь, что первый символ написан с заглавной буквы.

Комментарии:

1. Я тоже это видел, но похоже, что то, что OP имеет в опубликованном xml, правильно обработано (то, что опубликовано позже в вопросе, нет)

Ответ №4:

Вы можете перехватить ошибку в вашем Global.asax и отправить электронное письмо с исключением.

В Global.asax.cs:

  void Application_Error(object sender, EventArgs e)
        {
            // Code that runs when an unhandled error occurs
            Exception ex = Server.GetLastError();
            ExceptionHandler.SendExceptionEmail(ex, "Unhandled", this.User.Identity.Name, this.Request.RawUrl);
            Response.Redirect("~/ErrorPage.aspx"); // So the user does not see the ASP.net Error Message
        }
  

Мой метод в моем классе ExceptionHandler:

 class ExceptionHandler
    {
        public static void SendExceptionEmail(Exception ex, string ErrorLocation, string UserName, string url)
        {
            SmtpClient mailclient = new SmtpClient();
            try
            {
                string errorMessage = string.Format("User: {0}rnURL: {1}rn=====================rn{2}", UserName, url, AddExceptionText(ex));
                mailclient.Send(ConfigurationManager.AppSettings["ErrorFromEmailAddress"],
                                ConfigurationManager.AppSettings["ErrorEmailAddress"],
                                ConfigurationManager.AppSettings["ErrorEmailSubject"]   " = "   ErrorLocation,
                                errorMessage);
            }
            catch { }
            finally { mailclient.Dispose(); }
        }

        private static string AddExceptionText(Exception ex)
        {
            string innermessage = string.Empty;
            if (ex.InnerException != null)
            {
                innermessage = string.Format("=======InnerException====== rn{0}", ExceptionHandler.AddExceptionText(ex.InnerException));
            }
            string message = string.Format("Message: {0}rnSource: {1}rnStack:rn{2}rnrn{3}", ex.Message, ex.Source, ex.StackTrace, innermessage);
            return message;
        }
    }