在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
NO1 留言板(mysql的使用)演示:http://haojima.net 首先打开vs2017新建一个asp.net core项目(选Web应用程序),然后nuget 导入Microsoft.EntityFrameworkCore.Tools 1.1.1和MySql.Data.EntityFrameworkCore 8.0.8-dmr。 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); 后台关键代码也就这三句,建立连接、等待接收、发送消息。 【完整实现】:https://github.com/zhaopeiym/ChatRoom NO3 找工作(AngleSharp的使用)演示:http://job.haojima.net 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 部署多个站点以上,这些项目都比较简单。关键技术点和难点都进行的分析。我相信大家都可以动起手练习起来了。 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,不过需要修改你解析到的域名、程序路径和内网对应的端口(看配置里的注释) 。 [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上跑起来了。万分欢喜的我们,发现一分钟不发消息就自动掉线了。郁闷至极到头大。细心的同学通过上面的链接资料其实已经有说明:
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端口被占用。这个时候,我们就需要为每个程序分配不同的端口了。 { "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. 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"); 演示 源码 以上就是ASP.NET Core快速入门之实战篇的详细内容,更多关于ASP.NET Core实战的资料请关注极客世界其它相关文章! |
请发表评论