源栈培训:ASP.NET MVC-6:查漏补缺

更多
2019年08月05日 22点45分 作者:叶飞 修改

Config配置文件


作用:提供一个集中的位置用于存放项目的各种配置信息

特点:

  • 项目只在启动时读取一次就将其内容缓存(高性能)
  • 但在配置上面所做的更改不需要重启项目就可以立即生效

machine.config和web.config(或:app.config)

  • 当.NET安装的时候,就自动的带了一个machine.config,放置在C:\WINDOWS\Microsoft.NET\Framework\[Version]\CONFIG目录下,该文件包含了所有的全局的配置
  • 该目录下同时还有一些web.config文件,该文件可覆盖machine.config里面的配置
  • 网站根目录下的web.config,又可以覆盖上述web.config里的配置(最常用的配置修改位置
  • 同时,网站的根目录以下,每一级目录又都可以有一个web.config,下级目录的web.config就可以覆盖上一级目录……
关键结构:section和sectionGroup
<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="entityFramework" ……/>
  </configSections>
  <entityFramework>
    <providers>
      <provider ……/>
    </providers>
  </entityFramework>
</configuration>

演示:略


web.config

XML格式的ASP.NET项目的配置文件(最新版的core已使用json格式)

常用的有:

  • debug/release
        <compilation debug="true" targetFramework="4.6.1"/>
  • 数据库连接字符串
      <connectionStrings>
        <add name="SQLDbContext" connectionString="Data Source=(localdb)\ProjectsV13;Initial Catalog=17bangMVC;
             Integrated Security=True;User=sa;Password=sasa;" providerName="System.Data.SqlClient"/>
      </connectionStrings>
    然后,使用:
                string connectionString = ConfigurationManager.ConnectionStrings["17bang_dev"].ConnectionString;
    
    在.NET core中可:
    1. 使用依赖注入,在需要获取connection string的类中添加构造函数:
              private IConfiguration _configuration { get; }
              public SQLContext(IConfiguration configuration)
              {
                      _configuration = configuration;
              }
      然后再调用:
                  string connectionString = _configuration.GetConnectionString("RegisterContext");
      
    2. 或者,直接构造一个Configuration实例
              //获取appsettings.json在当前项目中的位置
              internal static string projectDirectory =
                  //CurrentDirectory:bin\debug\netcoreapp2.1
                  Directory.GetParent(Environment.CurrentDirectory)   
                  .Parent.Parent.FullName;
      
              internal static SQLContext context 
                  = new SQLContext(new ConfigurationBuilder()
                      .SetBasePath(projectDirectory)  
                      .AddJsonFile("appsettings.json")
                      .Build());  //Build()一个Configuration实例
  • 自定义错误
    aspxerrorpath
        <customErrors mode="On">
          <error statusCode="404" redirect="/Error/404"/>
        </customErrors>
    理解:mode=On/Off/RemoteOnly的意义。尤其是RemoteOnly,浏览器没有和MVC项目在同一条机器上就是remote
    跳转到自定义错误页面后,MVC会自动在url后面加上参数aspxerrorpath,如:

    注意避免:循环错误,即:自定义错误页面上面仍然有错误!(一般错误页面都使用静态页面)
    和HandleErrorAttribute的配合:
    1. mode="Off"的时候,HandleErrorAttribute不会起作用
    2. HandleErrorAttribute仅处理500的错误
    另外,HandleErrorAttribute:
    1. 默认注册在~/App_Start/FilterConfig.cs下
              //全局注册,作用于所有的Action
              public static void RegisterGlobalFilters(GlobalFilterCollection filters)
              {
                  filters.Add(new HandleErrorAttribute());
              }
    2. HandleErrorAttribute默认的错误页面是:~/Views/Shared/Error.cshtml

  • 缓存配置
    <system.web>
        <caching>
          <outputCacheSettings>
            <outputCacheProfiles>
              <add name="Cache1Minute" duration="60" varyByParam="none"/>
            </outputCacheProfiles>
          </outputCacheSettings>
        </caching>
    </system.web>
    [OutputCache(CacheProfile = "Cache1Minute")]
  • session
        <sessionState timeout="20" mode="InProc"/>
    
  • 自定义
      <appSettings>
        <add key="ClientValidationEnabled" value="true"/>
      </appSettings>
  • 其他第三方插件要求的配置,比如log4net(略)

文件上传

1、form属性添加:enctype="multipart/form-data"(默认为application/x-www-form-urlencoded)

<form action="/Profile/_UserIcon" method="post" enctype="multipart/form-data">
不建议这时候还使用using(Html.BeginForm(...))

2、在form中添加:

<input name="" type="file" accept="image/*" />

注意:

  • MVC没有提供文件上传的Html Helper
  • type="file"指明了这个控件用于上传文件
  • accept="image/*"指明可接受的文件类型为图片
  • 这种bootstrap的样式不是通过修饰input元素实现的,而是……(演示:略)

3、后台直接使用HttpPostedFileWrapper接收上传的文件,并调用SaveAs()进行存储

        public ActionResult _UserIcon(HttpPostedFileWrapper icon)
        {
            string path = Server.MapPath("~/Upload/Icons/");
            icon.SaveAs(path);
            //......
        }

注意path使用Server.MapPath()转换才能获得文件的本地路径

同时,注意设置好上传文件存储目录的权限:

  • 合法用户(如:IUser)可读写
  • 但要禁止执行,否则有可能恶意用户会上传伪装成图片的其他文件并设法运行……

4、仔细的设计文件存放的位置:

  • 通常不建议直接存放数据库(性能考虑,比如很难做CDN,没有浏览器缓存等),而是在数据库中存放一个文件路径
  • 考虑如何避免重名冲突:
    1. GUID等自定义名称:避免冲突,但不能覆盖
    2. 原文件名:能够覆盖(修改),但可能覆盖别人的
  • 大型项目:文件检索速度


错误日志:Elmah

MVC中应用,原文4步,实际上只需要2步:

  1. 添加引用(会自动修改web.config)
  2. 修改web.config,添加logger。以下演示为使用xml文件记录:
    <elmah>
      <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data" />
    </elmah>

还可以进行错误过滤(某些异常不进行处理),在Global.asax中添加:

        void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
        {
            if (e.Exception.GetBaseException() is HttpRequestValidationException)
            {
                e.Dismiss();
            }
        }

了解更多:MSDN文档


作业

  • 使用配置文件中的(而不是C#代码中)数据库连接字符串,连接数据库
  • 模仿一起帮,为404错误和500错误指定错误页面
  • 将之前的output cache配置为cache profile
  • 在个人资料中上传用户头像(已学前端同学需使用bootstrap样式),注意:
    1. 前台添加Required和文件类型验证
    2. 后台验证文件大小/类型
    3. 解决文件名冲突的问题
    4. 按年月日(或者你自己的方案)均匀分布用户上传文件,保证其索引速度
    5. 不要忘了数据库记录下文件路径,用于前台显示
  • 配置好ELMAH,能够记录所有错误信息



源栈培训 ASP.NET 配置 文件上传
赞: 3 踩: 2

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 1
2019年08月09日 15点50分 --- 第 1 楼 --- 推荐 小屿
 
叶飞的系列文章

源栈培训:ASP.NET全栈开发

飞哥的源栈培训:线上全程直播,免费收看;线下拎包入住,按周计费。本系列收录所有讲义(含视频录播地址)

编程那些事:菜鸟入门

大飞哥倾力之作,面向有意入行IT/开发/编程的初学者,欢迎任何形式的留言建议……

从包工头到程序猿

真实故事,讲述我在家装公司关门之后,如何转行成为一个程序猿的故事。(《折腾》第三卷)

《折腾》(卷一)青涩

时间段:从大学毕业到开始创业。离开青葱校园,涉世之初的那些往事……

《折腾》(卷二)风雨 之(1)工地

我一个完全的门外汉(无论装修还是管理),开始给黎叔装修房子。从踌躅满志,到四处碰壁;从一往直前,到左右为难……

《折腾》(卷二)风雨 之(2)胸怀

作为一个律师,接工程没签合同,被狠狠的坑了一把!年轻人暴烈的想要复仇,黎叔教他一个企业家的胸怀……

《折腾》(卷二)风雨 之(3)渠道

成立了公司,招聘了员工,开始大力的拓展业务,一个接一个的坑,摔倒了又爬起来……

《折腾》(卷二)风雨 之(4)视野

经历残酷现实的磨砺,终于明白:干啥事,都不能闭门造车,人要走出去,开阔视野……

未分类

系统自动生成的未分类系列

一锅大杂烩

从律师到包工头,从码农到写手,读书交友生活创业,各种零零碎碎,乱七八糟……

人人都是程序猿

计算机编程普及课程,视频:https://space.bilibili.com/55410301/#/channel/detail?cid=49491

全部
关键字



帮助

反馈