.net core建站踩坑记录

系统:win10 VS版本:2017 .NET Core 版本: 1.1

零.读取配置文件

参考:http://www.tuicool.com/articles/QfYVBvi

  1. 此版本无需添加其他组件
  2. appsettings.json配置中添加节点AppSettings
  1. 添加配置文件的映射模型
  1. 在Startup.cs ConfigureServices方法中注册

services.AddOptions(); services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

  1. Controller中使用
  1. 控制台使用 添加nuget包
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.0.0" />

main函数配置

           using Microsoft.Extensions.Configuration;
            var Configuration = new ConfigurationBuilder()
            .SetBasePath(System.IO.Directory.GetCurrentDirectory())
            .AddJsonFile(path: $"appsettings.json") 
            .AddJsonFile(path: $"appsettings.Test.json",optional:true) //可选,若有存在的key,则test优先级更高
            .Build();
            System.Console.WriteLine(Configuration.GetSection("test").Value);

一、登录记录session

参考:http://www.cnblogs.com/fonour/p/5943401.html

二、发布.net core1.1.2网站到windos服务器

参考:https://docs.microsoft.com/en-us/aspnet/core/publishing/iis

  1. 我的服务器是windows server 2012 ,.net core网站版本为1.1.2
  2. 经安装好iis
  3. 下载安装: .NET Core Windows Server Hosting Microsoft Visual C++ 2015 Redistributable Update 3
  1. 发布.net core网站到IIS,并将应用池的.NET CLR版本修改为[无托管代码]

三、DES加密解密算法

亲测可用

  public class SecurityHelper
  {
      #region 加密解密法一
      //默认密钥向量 
      private static byte[] Keys = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
      /// <summary> 
      /// DES加密字符串 
      /// </summary> 
      /// <param name="encryptString">待加密的字符串</param> 
      /// <param name="encryptKey">加密密钥,要求为16位</param> 
      /// <returns>加密成功返回加密后的字符串,失败返回源串</returns> 
      public static string EncryptDES(string encryptString, string encryptKey = "Key123Ace#321Key")
      {
          try
          {
              byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 16));
              byte[] rgbIV = Keys;
              byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
              var DCSP = Aes.Create();
              MemoryStream mStream = new MemoryStream();
              CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
              cStream.Write(inputByteArray, 0, inputByteArray.Length);
              cStream.FlushFinalBlock();
              return Convert.ToBase64String(mStream.ToArray());
          }
          catch (Exception ex)
          {
              return ex.Message + encryptString;
          }
      }
      /// <summary> 
      /// DES解密字符串 
      /// </summary> 
      /// <param name="decryptString">待解密的字符串</param> 
      /// <param name="decryptKey">解密密钥,要求为16位,和加密密钥相同</param> 
      /// <returns>解密成功返回解密后的字符串,失败返源串</returns> 
      public static string DecryptDES(string decryptString, string decryptKey = "Key123Ace#321Key")
      {
          try
          {
              byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey.Substring(0, 16));
              byte[] rgbIV = Keys;
              byte[] inputByteArray = Convert.FromBase64String(decryptString);
              var DCSP = Aes.Create();
              MemoryStream mStream = new MemoryStream();
              CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
              Byte[] inputByteArrays = new byte[inputByteArray.Length];
              cStream.Write(inputByteArray, 0, inputByteArray.Length);
              cStream.FlushFinalBlock();
              return Encoding.UTF8.GetString(mStream.ToArray());
          }
          catch (Exception ex)
          {
              return ex.Message + decryptString;
          }
      }
      #endregion 
  }

四、过滤器定义

继承Attribute,实现IActionFilter即可 简单校验登录,获取cookie值并解密后得到用户名,未登录则跳转登录(ApplicationKey为自定义的类存放)

public class UserCheckFilterAttribute : Attribute, IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext context)
    {
    }
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string encryptValue = "";
        filterContext.HttpContext.Request.Cookies.TryGetValue(ApplicationKey.User_Cookie_Key, out encryptValue);
        if (encryptValue == null)
        {
            filterContext.Result = new RedirectResult("/Account/Login");
            return;
        }
        var userName = SecurityHelper.DecryptDES(encryptValue, ApplicationKey.User_Cookie_Encryption_Key);
        if (string.IsNullOrEmpty(userName))
        {
            filterContext.Result = new RedirectResult("/Account/Login");
            return;
        }
    }
}

五、注入服务

Startup.cs中的ConfigureServices方法调用services.AddTransient<IUserService,UserService>();注册服务

根据路径调用脚本

调用:var errMsg="";var result=ExcuteBatFile(path,ref errMsg);

    public static string ExcuteBatFile(string batPath, ref string errMsg)
    {
        if (errMsg == null) throw new ArgumentNullException("errMsg");
        string output;
        using (Process process = new Process())
        {
            FileInfo file = new FileInfo(batPath);
            if (file.Directory != null)
            {
                process.StartInfo.WorkingDirectory = file.Directory.FullName;
            }
            process.StartInfo.FileName = batPath;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError = true;
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.CreateNoWindow = true;
            process.Start();
            //process.WaitForExit();
            output = process.StandardOutput.ReadToEnd();
            errMsg = process.StandardError.ReadToEnd();
        }
        return output;
    }

命令生成发布文件

系统需要安装CORE SDK 若上传到git仓库,拉取后需要再项目目录中执行还原命令 dotnet restore dotnet publish --framework netcoreapp1.1 --output "C:\Publish" --configuration Release 命令相关文档:https://docs.microsoft.com/zh-cn/dotnet/core/tools/

linux 部署

安装Ubuntu(ubuntu-16.04.2-server-amd64.iso) 教程:http://www.cnblogs.com/wangjieguang/p/hyper-v-ubuntu.html 部署文章参考:http://www.cnblogs.com/wangjieguang/p/aspnetcore-ubuntuserver.html Linux下安装SDK https://www.microsoft.com/net/core#linuxubuntu

文章收集

超详细的Hyper-V安装Ubuntu: http://www.cnblogs.com/wangjieguang/p/hyper-v-ubuntu.html Ubuntu部署.NET Core:http://www.cnblogs.com/wangjieguang/p/aspnetcore-ubuntuserver.html

--------------------2017-07-24记录--------------------

接口return Json()时序列化小写的问题

在Startup.cs-》ConfigureServices方法配置一下解决

        public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddMvc()
                    .AddJsonOptions(op =>
                    {
                        //解决序列化后数据小写问题
                        op.SerializerSettings.ContractResolver =
                       new Newtonsoft.Json.Serialization.DefaultContractResolver();
                        //返回数据中有DateTime类型,自定义格式
                        op.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm";
                    });
        }

视图中输出中文会编码

ConfigureServices方法中配置即可,详情见院长文章 http://www.cnblogs.com/dudu/p/5879913.html

            services.Configure<WebEncoderOptions>(options =>
            {
                options.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.All);
            });

中文乱码解决

控制台乱码

添加:Console.OutputEncoding = Encoding.Unicode;

网页输出乱码

添加:context.Response.ContentType = "text/pain;charset=utf-8";

参考评论:http://www.cnblogs.com/wolf-sun/p/6136482.html

.net core中配置伪静态

Configure方法中,还是一样的配方

         app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "index",
                    template: "index.html",
                    defaults: new { controller = "Home", action = "Index" }
                );
                routes.MapRoute(
                    name: "detail",
                    template: "detail/{id}.html",
                    defaults: new { controller = "Home", action = "Detail" }
                );
                routes.MapRoute(
                    name: "add",
                    template: "add.html",
                    defaults: new { controller = "Home", action = "Add" }
                );
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

单个文件上传

        [HttpPost]
        public IActionResult Upload(IFormFile file)
        {
            string previewPath = "";//加域名什么的
            long size = 0;
            var upFileName = ContentDispositionHeaderValue
                   .Parse(file.ContentDisposition)
                   .FileName
                   .Trim('"');
            var fileName = Guid.NewGuid() + Path.GetExtension(upFileName);
            size += file.Length;
            if (size > UploadMaxLength)
            {
                return Json(new
                {
                    code = 0,
                    msg = "图片太大,不能超过5M"
                });
            }
            previewPath += "/uploads/" + fileName;
            var savePath = _hostingEnv.WebRootPath + @"\uploads\" + fileName;
            var saveDir = _hostingEnv.WebRootPath + @"\uploads\";

            if (!Directory.Exists(saveDir))
            {
                Directory.CreateDirectory(saveDir);
            }
            using (FileStream fs = System.IO.File.Create(savePath))
            {
                file.CopyTo(fs);
                fs.Flush();
            }
            return Json(new
            {
                code = 0,
                msg = "上传成功",
                data = new
                {
                    src = previewPath,
                    title = ""
                }
            });
        }

返回JSON自定义DateTime类型格式

services.AddMvc().AddJsonOptions(op =>
{
    op.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm";
});

[FromBody]接口模型验证类型转换的问题

如果模型中存在非空值类型的字段A:public int 字段A{get;set;} 然后向接口提交一个 {字段A:""}或者{字段A:null} 提交后会被 ModelState 拦截验证不通过 目前的解决方法有

  • 修改类型为可空类型
  • 全局设置下序列化忽略null和空字符串,目前 [FromForm] 格式的数据不知道如何处理
 services.AddMvc().AddJsonOptions(op =>
{
    op.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
    op.SerializerSettings.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
});

.net core 获取IP地址

request.HttpContext.Connection.RemoteIpAddress

.net core 获取请求URL

// GetAbsoluteUri(request)
      public string GetAbsoluteUri(HttpRequest request)
        {
            return new StringBuilder()
                .Append(request.Scheme)
                .Append("://")
                .Append(request.Host)
                .Append(request.PathBase)
                .Append(request.Path)
                .Append(request.QueryString)
                .ToString();
        }

.net core 过滤器中获取提交的post数据

  1. 文档地址:https://docs.microsoft.com/zh-cn/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.0#action-filters
  2. 相关issues:https://github.com/aspnet/Mvc/issues/7251

.net core 实现一个日志过滤器

    public class AdminLogAttribute : Attribute, IActionFilter
    {

        public void OnActionExecuting(ActionExecutingContext filterContext)
        {

        }
        public void OnActionExecuted(ActionExecutedContext context)
        {
            //获取提交的参数 context.ActionArguments 

        }

   }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入

前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 本节重构一下代码,采用IOC控制反转,也就是依赖注入 您可以访问http://unit...

30470
来自专栏飞扬的花生

Npoi导入导出Excel操作

    之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求。 在winform上面实现excel操作:ht...

61450
来自专栏飞扬的花生

Npoi导入导出Excel操作

    之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求。 在winform上面实现excel操作:ht...

524100
来自专栏葡萄城控件技术团队

ASP.NET 5系列教程(七)完结篇-解读代码

在本文中,我们将一起查看TodoController 类代码。 [Route] 属性定义了Controller的URL 模板: [Route("api/[con...

22650
来自专栏张善友的专栏

在asp.net页面上得到Castle容器的实例

在项目中使用Castle IOC容器,Asp.net程序中如何得到Castle容器内。 可以如下实现: 1、Gloabal实现接口IContainerAcces...

214100
来自专栏葡萄城控件技术团队

ASP.NET Web API 应用教程(一) ——数据流使用

相信已经有很多文章来介绍ASP.Net Web API 技术,本系列文章主要介绍如何使用数据流,HTTPS,以及可扩展的Web API 方面的技术,系列文章主要...

39680
来自专栏用户2442861的专栏

PyQt中如何结合Qt设计师进行开发

Qt设计师是Qt的所见即所得的界面设计工具,通过拖拉方式设计界面,但它并不能产生任何代码。

12810
来自专栏程序员的SOD蜜

一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架

问题:3行代码 PDF.NET 是一个开源的数据开发框架,它的特点是简单、轻量、快速,易上手,而且是一个注释完善的国产开发框架,受到不少朋友的欢迎,也在我们公...

32090
来自专栏.NET开发那点事

使用Microsoft Fakes进行单元测试(2)

接上一篇使用Microsoft Fakes进行单元测试(1) 下面进行Shim的演示。 2.使用Shim替换静态方法 假设我们需要一个工具方法用来格式化当前时...

23090
来自专栏ZKEASOFT

.Net Core在Middleware中解析RouteData

在ASP.Net Core中,如果直接在Middleware中获取RouteData返回的是空值,这是因为RouterMiddleware还没执行。但有些情况下...

20830

扫码关注云+社区

领取腾讯云代金券