C# 如何优雅地处理ASP.NET MVC 4中的数据库连接?
在尝试连接到可能已关闭的数据库时,或者在MVC4中给定了错误的连接字符串时,如何优雅地处理错误 我的字符串位于Web.config中,它访问数据库的方式只是在每个控制器中实例化从DBContext派生的类,如下所示:C# 如何优雅地处理ASP.NET MVC 4中的数据库连接?,c#,asp.net-mvc,database,error-handling,C#,Asp.net Mvc,Database,Error Handling,在尝试连接到可能已关闭的数据库时,或者在MVC4中给定了错误的连接字符串时,如何优雅地处理错误 我的字符串位于Web.config中,它访问数据库的方式只是在每个控制器中实例化从DBContext派生的类,如下所示: private DBEntities db=新的DBEntities(“数据库”) 如果数据库已启动且一切正常,则此操作正常,但如果数据库未启动,则我的网站上的页面会显示此错误: 异常详细信息:System.ComponentModel.Win32异常:未找到网络路径 显然,我不希
private DBEntities db=新的DBEntities(“数据库”)代码>
如果数据库已启动且一切正常,则此操作正常,但如果数据库未启动,则我的网站上的页面会显示此错误:
异常详细信息:System.ComponentModel.Win32异常:未找到网络路径
显然,我不希望出现这种情况,我想做的是找到一种方法来尝试捕获错误并显示自定义错误页面(类似于404未找到页面)
谢谢。这取决于私有数据库实体db=新数据库实体(“数据库”)代码>是,何时调用,但为什么不:
try {
private DBEntities db = new DBEntities("database");
} catch (Exception ex) {
//do something here
}
它取决于哪里private DBEntities db=new DBEntities(“数据库”)代码>是,何时调用,但为什么不:
try {
private DBEntities db = new DBEntities("database");
} catch (Exception ex) {
//do something here
}
在函数中进行初始化
private DBEntities db;
// then in your function attempt to initialise
try{
db = new DBEntities("database");
db.Connection.Open();
}
catch(Exception ex){
if(db.Connection != ConnectionState.Closed){
db.Connection.Close();
db.Dispose();
//go to error page
}
}
在函数中进行初始化
private DBEntities db;
// then in your function attempt to initialise
try{
db = new DBEntities("database");
db.Connection.Open();
}
catch(Exception ex){
if(db.Connection != ConnectionState.Closed){
db.Connection.Close();
db.Dispose();
//go to error page
}
}
首先在共享视图文件夹中添加一个“Error.cshtml”视图。给它一个模型类型
System.Web.Mvc.HandleErrorInfo
然后将以下内容添加到web.config文件中
<system.web>
<customErrors mode="On" defaultRedirect="/Error" />
</system.web>
这将重定向到任何异常的错误视图
现在只需设置错误页面的样式
我建议您尝试{}catch{},正如在其他帖子中建议的那样,在catch块中,用一条用户友好的消息重新播放,比如“无法建立数据库连接”
这里有一个完整的讨论/解释:首先在共享视图文件夹中添加一个“Error.cshtml”视图。给它一个模型类型
System.Web.Mvc.HandleErrorInfo
然后将以下内容添加到web.config文件中
<system.web>
<customErrors mode="On" defaultRedirect="/Error" />
</system.web>
这将重定向到任何异常的错误视图
现在只需设置错误页面的样式
我建议您尝试{}catch{},正如在其他帖子中建议的那样,在catch块中,用一条用户友好的消息重新播放,比如“无法建立数据库连接”
这里有一个完整的讨论/解释:是的,这看起来不错,但每个控制器都有一行代码,所以我认为最好将代码放在函数中的某个位置,并在需要时实例化它。啊,一定要考虑将接口注入控制器,而不是在控制器本身中实例化DBEntities。我使用Ninject,但有很多很多可供选择…是的,这看起来不错,但每个控制器都有一行代码,所以我认为最好将代码放在函数中的某个位置,并在需要时实例化。啊,一定要考虑将接口注入控制器,而不是在控制器本身中实例化DBEntities。我使用Ninject,但还有很多很多可供选择。。。