阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Asp.Net Core1.1版本没了project.json,这样来生成跨平台包

406次阅读
没有评论

共计 6492 个字符,预计需要花费 17 分钟才能阅读完成。

本章将要和大家分享的是 Asp.NetCore1.1 版本去掉了 project.json 后如何打包生成跨平台包,为了更好跟进 AspNetCore 的发展,把之前用来做 netcore 开发的 vs2015 卸载后并安装了 vs2017,这给我带来的直接好处是把我报红的 C 盘腾出 10GB 左右的空间,从这里直接能感受到 vs2017 体积如此之小;之前有写过一篇开源 netcore 服务的文章开源一个跨平台运行的服务插件 – TaskCore.MainForm,里面有讲述 netcore 项目生成和部署在 win7 和 Ubuntu16.04 系统上的例子,感兴趣的朋友可以去看看;下面开始本文的内容,希望大家能够喜欢,也希望各位多多 ” 扫码支持 ” 和 ” 推荐 ” 谢谢!

AspNetCore 中使用 Session(基于 MemoryCache 组件)

这节内容看起来有点不符合文章标题,主要是只写生成跨平台包的内容太少,有些朋友觉得干活太少不满意,因此就用这如果使用 Session 来填充吧哈哈(我的理念是:一天一进步,哪怕一丁点);对于一个 web 程序来说 session 存储通常有很多种方式,例如我前面文章有使用 Redis 来存储 session 的相关文章,那对于一个 netcore 项目来说默认 session 存储的方式是 memorycache 的方式,可以这样在项目中的 Startup.cs 文件中 ConfigureServices 方法增加如下代码片段:

1 services.AddDistributedMemoryCache();
2 services.AddSession(b =>
3 {
4    b.IdleTimeout = TimeSpan.FromMinutes(1);5    b.CookieName = “MySid”;
6 });

并在 Configure 方法中添加 app.UseSession(); session 的使用;当把上面的代码片段复制到你程序中时,会提示一个小灯泡,需要你点击选择引用下对应的包,对于 vs2017 自动装了 netcore 的开发环境,所以只需要点击灯泡引用就行了,如果你没有装开发 sdk,那么需要下载 nuget 包:Microsoft.AspNetCore.Session;第一段 services.AddDistributedMemoryCache() 主要作用是添加 memorycache 存储引用,第二段 AddSession 方法才是真正添加 session 相关的东西,这里我用到的两个个属性:

1. IdleTimeout:设置 session 过期时间;

2. CookieName:设置 sessionId 存储在客户端浏览器中的 key 名称;

当完成上面步骤的操作后,可以在任意 Controller(这里是 HomeController)的 Action 中使用 HttpContext.Session.Set 方法添加 session:

public IActionResult About()
        {
            _logger.LogInformation(“ 这里是 About”);

            var userInfo = “ 我的 NetCore 之 Session”;
            HttpContext.Session.Set(SessionKey, System.Text.Encoding.UTF8.GetBytes(userInfo));
            ViewData[“Message”] = $” 读取配置文件 Option1 节点值:{this._options.Option1},添加 session”;
            return View();
        }

再通过另外 Contact 的 Action 中使用 HttpContext.Session.TryGetValue(SessionKey, out var bt) 来获取我们刚设置的 session:

public IActionResult Contact()
        {
            var userInfo = string.Empty;
            if (HttpContext.Session.TryGetValue(SessionKey, out var bt))
            {
                userInfo = System.Text.Encoding.UTF8.GetString(bt);
            }

            ViewData[“Message”] = string.IsNullOrWhiteSpace(userInfo) ? “Session 获取为空 ” : userInfo;
            return View();
        }

好了就这么简单,咋们运行看下效果:dontnet run 命令来运行测试站点,不出意外会在界面得到如下截图:

Asp.Net Core1.1 版本没了 project.json,这样来生成跨平台包

通过浏览器控制台能够看到咋们的 sessionId 的名称是 MySid,这个正如我们在 Startup.cs 设置的 CookieName 一样呢;

 

ISession 扩展方法

上面用到的 Set 方法来保存 sesseion,咋们来看看她的参数 void Set(string key, byte[] value); 键值对的方式,但是值是一个 byte[]类型的参数,我们每次使用的时候都需要自己转一下数据类型感觉不是很方便,那么我们通过扩展方法的方式来扩展下 ISession,如下扩展代码:

public static class PublicExtensions
    {
        #region ISession 扩展

        /// <summary>
        /// 设置 session
        /// </summary>
        /// <typeparam name=”T”></typeparam>
        /// <param name=”session”></param>
        /// <param name=”key”></param>
        /// <param name=”val”></param>
        /// <returns></returns>
        public static bool Set<T>(this ISession session, string key, T val)
        {
            if (string.IsNullOrWhiteSpace(key) || val == null) {return false;}

            var strVal = JsonConvert.SerializeObject(val);
            var bb = Encoding.UTF8.GetBytes(strVal);
            session.Set(key, bb);
            return true;
        }

        /// <summary>
        /// 获取 session
        /// </summary>
        /// <typeparam name=”T”></typeparam>
        /// <param name=”session”></param>
        /// <param name=”key”></param>
        /// <returns></returns>
        public static T Get<T>(this ISession session, string key)
        {
            var t = default(T);
            if (string.IsNullOrWhiteSpace(key)) {return t;}

            if (session.TryGetValue(key, out byte[] val))
            {
                var strVal = Encoding.UTF8.GetString(val);
                t = JsonConvert.DeserializeObject<T>(strVal);
            }
            return t;
        }

        #endregion
    }

直接传递一个对象 T 到扩展方法中,转类型后再存储的 session 中去,为了更好的测试我们直接在上面测试用例上修改代码如:

public IActionResult About()
        {
            _logger.LogInformation(“ 这里是 About”);

            //var userInfo = “ 我的 NetCore 之 Session”;
            //HttpContext.Session.Set(SessionKey, System.Text.Encoding.UTF8.GetBytes(userInfo));

            MoUser user = new MoUser();
            HttpContext.Session.Set<MoUser>(SessionKey, user);
            ViewData[“Message”] = $” 读取配置文件 Option1 节点值:{this._options.Option1},添加 session”;
            return View();
        }

        public IActionResult Contact()
        {
            //var userInfo = string.Empty;
            //if (HttpContext.Session.TryGetValue(SessionKey, out var bt))
            //{
            //    userInfo = System.Text.Encoding.UTF8.GetString(bt);
            //}

            //ViewData[“Message”] = string.IsNullOrWhiteSpace(userInfo) ? “Session 获取为空 ” : userInfo;

            var user = HttpContext.Session.Get<MoUser>(SessionKey);
            ViewData[“Message”] = user == null ? “Session 获取为空 ” : $” 昵称:{user.UserName}”;
            return View();
        }

看起来 set 或 get 的 session 操作都只需一句代码就完成了是不是方便了许多呢,最有命令:dotnet run 测试下效果,和上面的一样我就不截图了;

1.1 版本去掉了 project.json 后,如何生成跨平台包

到这里就进入今天的正题了,对于最新版本 netcore 去掉 project.json 网上讨论的还算比较激烈,但是网搜了下还没有一篇正式的中文文章来讲述如果生成夸平台包,这里有幸或许吧成为第一篇吧呵呵;首先,要明了 netcore 小组去掉 project.json 重要文件后,其任务都放在了项目的.csproj 文件中,没错就是咋们 vs 生成的项目工程文件,那上面测试用例为例我们看下.csproj 文件的内容:

<Project Sdk=”Microsoft.NET.Sdk.Web”>

  <PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>
  <PropertyGroup>
    <PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include=”Microsoft.ApplicationInsights.AspNetCore” Version=”2.0.0″ />
    <PackageReference Include=”Microsoft.AspNetCore” Version=”1.1.1″ />
    <PackageReference Include=”Microsoft.AspNetCore.Mvc” Version=”1.1.2″ />
    <PackageReference Include=”Microsoft.AspNetCore.Session” Version=”1.1.1″ />
    <PackageReference Include=”Microsoft.AspNetCore.StaticFiles” Version=”1.1.1″ />
    <PackageReference Include=”Microsoft.Extensions.Logging.Debug” Version=”1.1.1″ />
    <PackageReference Include=”Microsoft.VisualStudio.Web.BrowserLink” Version=”1.1.0″ />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include=”Microsoft.VisualStudio.Web.CodeGeneration.Tools” Version=”1.0.0″ />
  </ItemGroup>
</Project>

这里能够直观的在 ItemGroup 节点看到我们添加进来的 Session 的引用和项目模板自带的 Logging 等的引用,已经父节点 Project Sdk=Microsoft.NET.Sdk.Web,我们要生成跨平台运行包,就需要操作这个项目文件的配置信息,这里只需要添加如下代码:

1 <PropertyGroup>
2     <RuntimeIdentifiers>win7-x64;ubuntu.16.04-x64</RuntimeIdentifiers>
3   </PropertyGroup>

然后再通过发布命令就能够生成夸平台包了,是不是挺简单的,所以上面弄了一个 Session 小节做干货呢呵呵;咋们来测试下吧,首先在项目根目录这样以此执行命令:dontnet restore

Asp.Net Core1.1 版本没了 project.json,这样来生成跨平台包

再执行你简短的发布命令(这里我直接采用默认参数的方式执行,发布包会生成再 bin 下面):dotnet publish

Asp.Net Core1.1 版本没了 project.json,这样来生成跨平台包

这个时候我们能够在目录:bin\Debug\netcoreapp1.1下面看到 publish 文件夹,里面就是咋们程序执行文件了,为了测试下效果,这里我通过命令:dontnet WebApp01.dll (由于我这里安装了 sdk 所以可以直接这样命令运行)来运行我的测试用例项目:

Asp.Net Core1.1 版本没了 project.json,这样来生成跨平台包

到这里一个 windows 上运行的包就完成了,有朋友就开始疑惑那跨平台呢,还有您之前配置的 <RuntimeIdentifiers>win7-x64;ubuntu.16.04-x64</RuntimeIdentifiers> 有什么效果呢,那这里就开始演示怎么生成 ubunt.16.04-x64 的运行包了(win7-x64 的也同样方式);我们同样需要经过:dontnet restore 之后发布命令的时候这样写:

dotnet publish -f netcoreapp1.1 –runtime ubuntu.16.04-x64

命令说明:

-f:framework 的缩写;

netcoreapp1.1:是存放的文件夹;

–runtime:运行命令必须要的;

ubuntu.16.04-x64:存储的文件夹名称

Asp.Net Core1.1 版本没了 project.json,这样来生成跨平台包

最后的结果是在目录:Debug\netcoreapp1.1 下面生成了一个 ubuntu.16.04-x64 文件夹,里面就是咋们的运行程序包了;如果你想生成其他系统的运行包也是同样的操作流程:

1. 在项目.csproj 中添加对应的 Runtime 命令(如:win7-x64;osx.10-11-x64;ubuntu.16.04-x64);

2. 在 dotnet publish 的时候把最后一个参数改成对应的 Runtime 命令就行了(如:ubuntu.16.04-x64)

到此本文就结束了,希望能给您带来好的帮助,谢谢阅读;

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计6492字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7956716
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个 AI 智能体 — 跟创业大佬对话 前言 智能体(Agent)已经成为创业者和技术人绕...
星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛 NAS-5:飞牛 NAS 中的 Docker 功能介绍 大家好,我是星哥,今天给大家带来如何在...
亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示

亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示

亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示 首先来回顾一下 10...
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

  240 元左右!五盘位 NAS 主机,7 代 U 硬解 4K 稳如狗,拓展性碾压同价位 在 NA...
星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛 NAS-14:解锁公网自由!Lucky 功能工具安装使用保姆级教程 作为 NAS 玩家,咱们最...
安装并使用谷歌AI编程工具Antigravity(亲测有效)

安装并使用谷歌AI编程工具Antigravity(亲测有效)

  安装并使用谷歌 AI 编程工具 Antigravity(亲测有效) 引言 Antigravity...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...
星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛 NAS 硬件 03:五盘位 +N5105+ 双网口的成品 NAS 值得入手吗 前言 大家好,我...