#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;
}
}