我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ASP.NET Core快速入门之实战篇

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ASP.NET Core快速入门之实战篇

NO1 留言板(mysql的使用)

演示:http://haojima.net
这个功能很简单。就是对数据库的写入和展示。如果在Windows下,相信大家分分钟都可以搞定。而初次接触.net core + mysql可能需要注意些细节。

首先打开vs2017新建一个asp.net core项目(选Web应用程序),然后nuget 导入Microsoft.EntityFrameworkCore.Tools 1.1.1和MySql.Data.EntityFrameworkCore 8.0.8-dmr。
然后新建一个DbContext类。


public class DataContext : DbContext
{
    //【注意】连接字符串一定要加 sslmode=none 
    string str = @"Data Source=;Database=;User ID=;Password=;pooling=true;CharSet=utf8;port=3306;sslmode=none";
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) =>
        optionsBuilder.UseMySQL(str);

    //下面就可以添加要加入数据库的实体了
    //public DbSet<Message> Messages { get; set; }
}

到此为止,我们已经可以利用EF Core直接连接mysql进行增删改查操作了。注意:需要导入命名空间using Microsoft.EntityFrameworkCore; using MySQL.Data.EntityFrameworkCore.Extensions;

当然。你会说,连接字符串不能硬编码到代码里面。我们也可以放配置文件。appsettings.json


{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConnectionStrings": { "SqlServerConnection": "Data Source=;Database=;User ID=;Password=;pooling=true;CharSet=utf8;port=3306;sslmode=none" }
}

然后把上面的硬编码注释掉。在Startup.cs文件的ConfigureServices方法添加


var connection = Configuration.GetConnectionString("SqlServerConnection");
services.AddDbContext<DataContext>(options => options.UseMySQL(connection));

【注意】项目名称和路径最好不要有中文,不然会出现些乱七八糟的问题。

【完整代码】:https://github.com/zhaopeiym/BlogDemoCode/tree/master/MessageBoard

NO2 聊天室(WebSocket的使用)

演示:http://socket.haojima.net

WebSocket是Html5新增的一个很酷的技术。下面我们简单讲解下这个很酷的技术


var Socket = new WebSocket(url);//创建 WebSocket 对象

创建了一个WebSocket对象后会触发打开连接事件:


Socket.onopen = function(){  }

除了onopen事件,还有其他三个事件:


Socket.onmessage  //客户端接收服务端数据时触发
Socket.onerror    //通信发生错误时触发
Socket.onclose    //连接关闭时触发

另外还有两个方法:


Socket.send()   //使用连接发送数据
Socket.close()  //关闭连接

最后还有四个连接状态属性:


Socket.readyState
0 - 表示连接尚未建立。
1 - 表示连接已建立,可以进行通信。
2 - 表示连接正在进行关闭。
3 - 表示连接已经关闭或者连接不能打开。

整个WebSocket常用功能知识点就四个事件、两个方法、四种状态。简单吧,下面我们看看asp.net core后台的配合:

后台添加一个SocketHandler类,并添加一个静态方法Map:


/// <summary>
/// 请求
/// </summary>
/// <param name="app"></param>
public static void Map(IApplicationBuilder app)
{
    app.UseWebSockets(); //【注意】需要 nuget   导入 Microsoft.AspNetCore.WebSockets.Server
    app.Use(Acceptor);
}

然后新增对应的Acceptor方法:


/// <summary>
/// 接收请求
/// </summary>
/// <param name="httpContext"></param>
/// <param name="n"></param>
/// <returns></returns>
static async Task Acceptor(HttpContext httpContext, Func<Task> n)
{

需要在Startup.cs类里面的Configure方法里面加入


app.Map("/ws", SocketHandler.Map);   //传入我们刚才新建的静态方法Map

现在为止,基本的类和配置已经完成。

我们主要操作,是在Acceptor方法里面接收和发送消息。


//建立连接
var socket = await httpContext.WebSockets.AcceptWebSocketAsync();
//等待接收数据
await socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
//发送消息
await socket.SendAsync(arraySegment, WebSocketMessageType.Text, true, CancellationToken.None);

后台关键代码也就这三句,建立连接、等待接收、发送消息。
不过这里有一点需要理解。建立连接后,可以接收任意多次客户端消息。所以ReceiveAsync等待接收这里需要死循环接收消息,直到连接断开。(不用担心真的死循环,没有消息发送的时候,代码会阻塞在那里等待消息)

【完整实现】:https://github.com/zhaopeiym/ChatRoom

NO3 找工作(AngleSharp的使用)

演示:http://job.haojima.net
对于爬虫抓包,我相信大家初次接触都非常的热衷于此。我也不例外。
那么在asp.net core下面是否也有这样的插件呢?答案是肯定的。
http://www.cnblogs.com/linezero/p/5599611.html HtmlAgilityPack HTML解析(感谢博主对.net core的贡献)。不过xpath用起来超级恶心。
之前在.net下面有一款Jumony http://www.cnblogs.com/Ivony/p/3447536.html(博客园大牛写的)。支持CSS选择和linq查询。简直不要太爽。可是不支持.net core。(本人试了下迁移.net core,发现很多类在.net core没有实现)
最后还是到了一款支持.net core的解析组件。并可以媲美Jumony,同样支持css选择和linq查询。那就是AngleSharp。
新建项目,nuget 安装 AngleSharp。然后以下简单使用:


using (HttpClient http = new HttpClient())
{
    var htmlString = await http.GetStringAsync(url);
    HtmlParser htmlParser = new HtmlParser();
    var jobInfos = htmlParser.Parse(htmlString)
        .QuerySelectorAll(".newlist_list_content table")
        .Where(t => t.QuerySelectorAll(".zwmc a").FirstOrDefault() != null)
        .Select(t => new JobInfo()
        {
            PositionName = t.QuerySelectorAll(".zwmc a").FirstOrDefault().TextContent,
            CorporateName = t.QuerySelectorAll(".gsmc a").FirstOrDefault().TextContent,
            Salary = t.QuerySelectorAll(".zwyx").FirstOrDefault().TextContent,
            WorkingPlace = t.QuerySelectorAll(".gzdd").FirstOrDefault().TextContent,
        .ToList();
    return jobInfos;
}

看到没有,就像jq一样解析html。如果你说不爽我都不信。

【完整实现】:https://github.com/zhaopeiym/JobWanted

部署多个站点

以上,这些项目都比较简单。关键技术点和难点都进行的分析。我相信大家都可以动起手练习起来了。
不过有个问题,前面我们只说了部署一个应用程序。如果是多个该怎么部署呢?
首先我们把多个程序发布包放到服务器上。
然后修改nginx的配置文件/etc/nginx/conf.d/default.conf


server {
    listen 80;
    server_name www.haojima.net;           #对应的域名
    root /home/projects/messagBoard;       #程序路径
    location / {
        proxy_pass http://localhost:5000;  #内网端口
        proxy_http_version 1.1; 
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-real-ip $remote_addr;
        
        proxy_set_header Upgrade $http_upgrade;   
    }
}

有几个程序就添加几个server,不过需要修改你解析到的域名、程序路径和内网对应的端口(看配置里的注释) 。
然后修改supervisor的配置文件/etc/supervisor/conf.d/supervisord.conf


[program:MessageBoard]
command=dotnet MessageBoard.dll        ; 运行程序的命令
directory= /home/projects/messagBoard/ ; 命令执行的目录
autorestart=true                    ; 程序意外退出是否自动重启
stderr_logfile=/var/log/WebApplication1.err.log ; 错误日志文件
stdout_logfile=/var/log/WebApplication1.out.log ; 输出日志文件
environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=root ; 进程执行的用户身份
stopsignal=INT

有几个程序就往下复制几份program。需要修改program名称,只要名称不重复就可以。然后修改 运行程序的命令 对应的dll和命令执行的目录(看配置文件的注释)。
如此就可以部署多个程序了。

开始我还以为是在域名解析的时候,解析IP + 端口。原来是多个域名解析到同一个IP,然后nginx在内部做域名和内网端口分发。

一些其它的细节

部署阿里云

我们在linux的防火墙开放了端口,发现在外面还是访问不了(可以telnet IP 端口 来测试)。有可能是阿里云拦截了。https://help.aliyun.com/document_detail/25471.html 在安全组添加某端口哪些IP可以访问。

mysql的客户端

对于mysql,我们安装好之后总不能每次命令操作吧。在Windows下面有个客户端Navicat可以方便管理mysql。Navicat

获取ip

用了nginx后发现取不到浏览器IP了。那是因为我们程序都是浏览器访问nginx,然后nginx转发内网程序端口。所以取到的IP都是内网本机IP。如果需要取浏览器IP需要在nginx配置


server {
    listen 80;
    server_name www.haojima.net;
    root /home/projects/messagBoard;
    location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1; 
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-real-ip $remote_addr;     # 新添加
    }
}

然后代码里面取IP:


var ip = HttpContext.Request.Headers["X-real-ip"].FirstOrDefault();

WebSocket在nginx的配置

上面我们写的WebSocket直接运行发现没有任何问题,可是部署在nginx去跑不起来了。那是因为需要nginx支持WebSocket,需要配置。http://nginx.org/en/docs/http/websocket.html


server {
    listen 80;
    server_name job.haojima.net;
    root /home/projects/jobWanted;
    location / {
        proxy_pass http://localhost:5002;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-real-ip $remote_addr;
        proxy_set_header Upgrade $http_upgrade;     # 新增
        #proxy_set_header Connection "upgrade";      # 新增 
        proxy_set_header Connection $http_connection;  #ws和post同时使用  https://github.com/aspnet/KestrelHttpServer/issues/1263
    }
}

WebSocket心跳

经过上面的配置,我们的WebSocket在nginx上跑起来了。万分欢喜的我们,发现一分钟不发消息就自动掉线了。郁闷至极到头大。细心的同学通过上面的链接资料其实已经有说明:

By default, the connection will be closed if the proxied server does not transmit any data within 60 seconds. This timeout can be increased with the proxy_read_timeout directive. Alternatively, the proxied server can be configured to periodically send WebSocket ping frames to reset the timeout and check if the connection is still alive.

nginx给出了两种解决方案。第一种,修改proxy_read_timeout (默认60秒)。第二种,浏览器客户端定时发送心跳包(时间要短于proxy_read_timeout)。

我使用的是第二种方式。

第一种虽然简单粗暴,但是时间再长也是一个值,还是会有超时的可能。再者,谁能保证浏览器端不会new 很多个WebSocket出来捣蛋。

第二种方式,浏览器定时发送一条消息,内容和后台约定下。如发送“心跳”,然后后台接收消息是,判断如果是“心跳”则不做任何处理。

中文编码

在做“找工作”爬前程无忧的数据时,发现他们使用的GBK编码。而在.net core中默认不支持这种格式,导致取到的数据都是乱码。我们需要nuget安装System.Text.Encoding.CodePages。然后在Startup.cs的Configure里面注册:


Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//注册编码提供程序

使用:


var htmlBytes = await http.GetByteArrayAsync(url);
var htmlString = Encoding.GetEncoding("GBK").GetString(htmlBytes);

asp.net core 端口分配

asp.net core 默认端口都是5000。那么我们运行第二个程序的时候就会提示5000端口被占用。这个时候,我们就需要为每个程序分配不同的端口了。
在根目录新建一个json文件hosting.json


{
  "server.urls": "http://*:5002"
}

在Program.cs文件修改


public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
          .SetBasePath(Directory.GetCurrentDirectory())
          .AddJsonFile("hosting.json", optional: true)
          .Build();

    var host = new WebHostBuilder()
        .UseKestrel()
        .UseConfiguration(config)
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .UseApplicationInsights()
        .Build();

    host.Run();
}

爬拉勾数据

在爬拉勾网的时候没有搞定,不知道是不是因为https的原因。


using (HttpClient http = new HttpClient())
{
    var url = "https://www.lagou.com/zhaopin/Java/?labelWords=label";
    var htmlString = await http.GetStringAsync(url);
}

在.net core中报错:An unhandled exception occurred while processing the request.
在.net 4.5 中抓到的数据是“页面加载中...”。和浏览器访问的结果不一样。


170819搞定

https://github.com/zhaopeiym/JobWanted/blob/master/JobWanted/Controllers/JobsController.cs#L211

//拉勾网 后台检测了user-agent、X-Requested-With、Referer还会检测list_是否有参数
http.DefaultRequestHeaders.Add("Referer", "https://www.lagou.com/jobs/list_.net");
http.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0");
http.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");

演示
http://haojima.net
http://socket.haojima.net
http://job.haojima.net

源码
https://github.com/zhaopeiym/JobWanted
https://github.com/zhaopeiym/ChatRoom
https://github.com/zhaopeiym/BlogDemoCode

以上就是ASP.NET Core快速入门之实战篇的详细内容,更多关于ASP.NET Core实战的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ASP.NET Core快速入门之实战篇

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java的MyBatis快速入门和实战详解

这篇文章主要介绍了Java的MyBatis快速入门和实战详解,MyBatis是一款优秀的持久层框架,用于简化JDBC开发,是一套可重用的,通用的,软件基础代码模型,需要的朋友可以参考下
2023-05-18

Android开发入门环境快速搭建实战教程

这篇文章主要为大家展示了“Android开发入门环境快速搭建实战教程”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android开发入门环境快速搭建实战教程”这篇文章吧。方法如下:在开始之前,我
2023-05-30

c++入门必学算法之快速幂思想及实现

快速幂相较于普通的幂,具有占用空间少,效率更高等优点,全面碾压普通的幂,下面这篇文章主要给大家介绍了关于c++入门必学算法之快速幂思想及实现的相关资料,需要的朋友可以参考下
2022-11-13

Go语言数据类型转换实战指南:快速入门教程

快速上手Go语言数据类型转换:实战教程引言:数据类型转换在程序开发中经常会遇到,特别是在处理不同类型之间的数据交互时尤为常见。在Go语言中,数据类型转换非常简单和高效。本文将通过实战教程,介绍Go语言中的数据类型转换,并给出具体的代码示例
Go语言数据类型转换实战指南:快速入门教程
2024-01-13

2023年最新最全uniCloud入门学习,零基础入门到实战项目 uni-admin打造uniapp网页后端 微信支付宝抖音小程序后端 unicloud数据后台快速打造uniapp小程序项目

今天开始带着大家一起零基础学习uniCloud,在下面的课程中我们就简称uniCloud为cloud吧。我这里从零基础开始教大家,后面可以带大家简单的做一个实战项目。所以不用担心自己没有基础,跟着石头哥认真学习就行了的。 一,认识un
2023-08-23

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录