前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >.net core建站踩坑记录

.net core建站踩坑记录

作者头像
易墨
发布于 2018-09-14 07:47:15
发布于 2018-09-14 07:47:15
95700
代码可运行
举报
运行总次数:0
代码可运行

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

零.读取配置文件

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

  1. 此版本无需添加其他组件
  2. appsettings.json配置中添加节点AppSettings
  1. 添加配置文件的映射模型
  1. 在Startup.cs ConfigureServices方法中注册
代码语言:txt
AI代码解释
复制
  services.AddOptions();      services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
  1. Controller中使用
  1. 控制台使用 添加nuget包
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.0.0" />

main函数配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
           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加密解密算法

亲测可用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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为自定义的类存放)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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方法配置一下解决

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        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方法中配置即可,详情见院长文章 https://cloud.tencent.com/developer/article/1395027

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            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方法中,还是一样的配方

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
         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?}");
            });

单个文件上传

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        [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类型格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 格式的数据不知道如何处理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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 实现一个日志过滤器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class AdminLogAttribute : Attribute, IActionFilter
    {

        public void OnActionExecuting(ActionExecutingContext filterContext)
        {

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

        }

   }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-07-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2023年03月 MES生产制造执行系统-001.Autofac的使用
IoC容器是一种设计模式,它可以管理应用程序中的对象依赖关系。它可以自动创建和注入对象,从而减少了代码的耦合度和重复性。
愚公搬代码
2023/03/16
5040
【愚公系列】2023年03月 MES生产制造执行系统-001.Autofac的使用
【Unity3D】存档文件加密代码
存档文件, 被修改起来现在变的很容易了, 为了解决这个问题,请用下面的代码,修改playerPrefs.cs
py3study
2020/01/08
5600
mvc网站迁移.net core记录
ConfigureServices方法中配置即可,详情见院长文章 http://www.cnblogs.com/dudu/p/5879913.html
易墨
2018/09/14
7300
mvc网站迁移.net core记录
c#通用登录模块,简单好用,一贴见效
// 举个例子:一个网站有用户系统、商家系统、网站后台3个系统 //可以分3个userType, user ,shop , system //网站后台一般都有角色,如admin,employee //那么网站的角色就有 user,shop,admin,employee,但是admin和employee在一个客户端是不能同时登陆的,所以他们是同一类用户(system) 使用方法: 1、添加一个类LoginUser.cs 代码如下: 代码: namespace MVCCommonAut
阿炬
2018/05/11
1.1K2
ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门
本篇代码基于上一篇进行调整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-02
KenTalk
2018/10/09
1.2K0
ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门
.Net Core 2.0的一些不大一样的地方(一)——基础身份认证
近日,把之前使用.net core 1.0写的网站,使用.net core 2.0改写了一下,发现一些不大一样的地方,如果不注意的话,会出现些问题。 一、先说下关于使用Cookie来验证用户登录的地方: 在.net core 1.x时代,具体作法如我前面的文章《.Net Core系列教程(四)—— 基础身份认证》所说,这里我就不重新写了 而在.net core 2.0中,需要做以下调整: 1)在Startup.cs文件中,ConfigureServices方法下添加:
徐大嘴
2019/03/21
1.3K0
asp.net core 2.0 查缺补漏
asp.net core 2.0 一些有用有趣的设置. 面向(targeting)不同的.net版本: 打开asp.net core 2.0的项目文件: xxx.csproj, 这部分: <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp2.0</TargetFramework> </PropertyGroup> TargetFramework就是指向的版本. 也可以指向多个.n
solenovex
2018/03/01
6880
asp.net core 2.0 查缺补漏
C#中CA加密与DES加密的混合使用
这段时间搞了个接口加密的重写,感觉信息的加密在数据传输中还是比较重要的,小小的研究了下,做点笔记,以备查阅。
code2roc
2023/07/19
2810
ASP.NET MVC5+EF6+EasyUI 后台管理系统(62)-EF链接串加密
前言:   这一节提供一个简单的功能,这个功能看似简单,找了一下没找到EF链接数据库串的加密帮助文档,只能自己写了,这样也更加符合自己的加密要求 有时候我们发布程序为了避免程序外的SQL链接串明文暴露,需要进行一些加密手段! 加密主要分几类:对称加密,非对称加密,散列算法(自己百度脑补,这里不再多说) 我这里选择AES 256位的加密,主要加密速度算法快,安全性高,资源消耗低。 公司一直在使用AES加密来加密一些小数据量的数据,比较方法和安全   这是我选择加密AES的理由,当然你可以选择其他有名的加密
用户1149182
2018/01/16
1K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(62)-EF链接串加密
ASP.NET Core 介绍和项目解读
标签: ASP.NETCore 1. 前言 作为一个.NET Web开发者,我最伤心的时候就是项目开发部署时面对Windows Server上贫瘠的解决方案,同样是神器Nginx,Win上的Nginx便始终不如Linux上的,你或许会说“干嘛不用windows自带的NLB呢”,那这就是我这个小鸟的从众心理了,君不见Stack Overflow 2016最新架构中,用的负载和缓存技术也都是采用在Linux上已经成熟的解决方案吗。没办法的时候找个适合的解决办法是好事,有办法的时候当然要选择最好的解决办法。
潘成涛
2018/01/18
2.7K0
ASP.NET Core 介绍和项目解读
快速入门系列--WebAPI--04在老版本MVC4下的调整
WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了。在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.Net.Http程序集非常的丰富,而老版本的则相对较弱。在WebAPI v1.0(和ASP.NET MVC4在一起的版本)很多的类和接口并不存在,同时对Task异步编程(ApiController默认提供异步执行方法)的支持还有一些欠缺(缺少不少方便的扩展方法),在使用时会有一些需要注意的地方,由于一些老的项目用
用户1216676
2018/01/24
1.1K0
ASP.NET Core 数据加解密的一些坑
ASP.NET Core 给我们提供了自带的Data Protection机制,用于敏感数据加解密,带来方便的同时也有一些限制可能引发问题,这几天我就被狠狠爆了一把
Edi Wang
2019/07/08
1.7K0
ASP.NET Core 数据加解密的一些坑
《ASP.NET Core 微服务实战》-- 读书笔记(第10章)
云应用意味着应用运行所在的基础设施无法掌控,因此安全不能再等到事后再考虑,也不能只是检查清单上毫无意义的复选框
郑子铭
2021/01/13
1.9K0
《ASP.NET Core 微服务实战》-- 读书笔记(第10章)
《ASP.NET Core 微服务实战》-- 读书笔记(第7章)
在本章,我们将从一个命令行应用开始,并且在不借助任何模板,脚手架和向导的情况下,最终得到一个功能完整的 Web 应用
郑子铭
2021/01/13
6550
《ASP.NET Core 微服务实战》-- 读书笔记(第7章)
配置文件中的数据库连接串加密了,你以为我就挖不出来吗?
前几天在调试物联柜终端上的一个bug时发现 app.config 中的数据库连接串是加密的,因为调试中要切换数据库,我需要将密文放到专门的小工具上解密,改完连接串上的数据库名,还得再加密贴到 app.config 中,烦的要死,内容如下:
独立观察员
2022/12/06
7120
配置文件中的数据库连接串加密了,你以为我就挖不出来吗?
基于ASP.NET core的MVC站点开发笔记 0x01
先到上面提供的下载地址,下载对应平台的dotnet装上,然后在命令行窗口输入dotnet --version查看输出是否安装成功。
CN_Simo
2020/07/07
9000
在.NET Core 中使用Quartz.NET
Quartz.NET是功能齐全的开源作业调度系统,可用于最小的应用程序到大型企业系统。
全球技术精选
2021/02/19
1.3K0
在.NET Core 中使用Quartz.NET
ASP.NET Core 应用程序Startup类介绍
Startup类配置服务和应用程序的请求管道。 Startup 类 ASP.NET Core应用程序需要一个启动类,按照惯例命名为Startup。在主程序的Web Host生成器(WebHostBuilderExtensions)的 UseStartup <TStartup> 扩展方法中指定启动类名称。 您可以为不同的环境定义不同的Startup类,并在运行时选择适当的Startup类。如果在Web Host配置或选项中指定startupAssembly(启动程序集),托管将加载该启动程序集并搜索 Star
晓晨
2018/06/22
9170
【C】KoobooJson在asp.net core中的使用
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/j_teng/article/details/100924973
心莱科技雪雁
2019/09/25
7660
【C】KoobooJson在asp.net core中的使用
Ken的杂谈从ASP.NET Core 2.1迁移到3.1
Ken的杂谈从2017年就开始采用 .NET Core作为开发框架,当时用的还是 .NET Core 2.0。 随后,.NET Core 2.1(LTS) 在2018年发布,Ken的杂谈又紧跟版本升级到 .NET Core 2.1 后面.NET Core3.0发布,但不是LTS版本,再加上我又懒,所以就干脆等到 .NET Core 3.1(LTS)正式发布,才来升级。毕竟这也是 .NET Core的最后一个主版本,下一个版本就是大一统的 .NET 5了。
KenTalk
2020/01/20
1.5K0
相关推荐
【愚公系列】2023年03月 MES生产制造执行系统-001.Autofac的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验