linq

结合实际需求,在webapi内利用WebSocket建立单向的消息推送平台,让A页面和服务端建立WebSocket连接,让其他页面可以及时给A页面推送消息

爷,独闯天下 提交于 2020-08-13 17:16:17
1.需求示意图 2.需求描述 原本是为了给做unity3d客户端开发的同事提供不定时的消息推送,比如商城购买道具后服务端将道具信息推送给客户端。 本篇文章简化理解,用“相关部门开展活动,向全市人民征集社会服务改善意见”为例子。但核心想法一致: 单向推送(指这个需求上只需要单向) 。所以这个功能 并不是聊天室 ,即便websocket技术是做双向通信的,但在 本需求中 不需要核心页面和客户端之间互相通信。核心界面只和服务端建立WebSocket连接,推送消息全部来自其他地方。 只有核心页面和服务端建立WebSocket连接,其他市民们都是通过web开发者耳熟能详的http协议在发送消息,不是市民们和部门公告栏玩WebSocket互动 。 3.代码如下,复制即可使用 (webapi跨域的代码不演示) ①WebSocket帮助类,负责建立连接和推送消息 using System; using System.Collections.Generic; using System.Linq; using System.Net.WebSockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Web; using System.Web.WebSockets;

十个便捷的单行代码编程技巧

假如想象 提交于 2020-08-13 07:11:03
1、对列表/数组中的每个元素都乘以2 // www.1b23.com Range是半开区间 int [] ia = range(1, 10).map(i -> i * 2).toArray(); List<Integer> result = range(1, 10).map(i -> i * 2).boxed().collect(toList()); 2、计算集合/数组中的数字之和 range(1, 1000).sum(); range(1, 1000).reduce(0, Integer::sum); Stream.iterate(0, i -> i + 1).limit(1000).reduce(0, Integer::sum); IntStream.iterate(0, i -> i + 1).limit(1000).reduce(0, Integer::sum); 3、验证字符串是否包含集合中的某一字符串 final List<String> keywords = Arrays.asList("brown", "fox", "dog", "pangram"); final String tweet = "The quick brown fox jumps over a lazy dog. #pangram http://www.rinkworks.com/words

.net core微服务——gRPC(下)

心不动则不痛 提交于 2020-08-13 05:28:26
序 上一篇博客把grpc的概念说了个大概,介绍了proto的数据类型,基本语法,也写了个小demo,是不是没那么难? 今天要从理论到实际,写两个微服务,并利用grpc完成两者之间的通信。只是作为demo写的话会十分简单,毕竟理解为主。 服务端 首先要拿出之前写好的proto文件,然后修改两个属性: Build Action => Protobuf compiler gRpc Stub Classes => Server only 如图: 当然也可以在项目文件里看到它: 然后重新生成项目 ,会自动根据proto文件生成server端的文件。 引用 经过刚才,已经生成了对应的服务,我们可以直接在代码里调用。 这是之前写好的proto: syntax = " proto3 " ; option csharp_namespace = " gRPCApiDemo.Protos " ; package Demo; service MyMath{ rpc MathAdd (AddRequest) returns (AddRespones) {} } message AddRequest{ int32 a = 1 ; int32 b = 2 ; } message AddRespones{ int32 a = 1 ; } 生成以后,会有一个MyMath.MyMathBase这个类,我们来继承一下:

api.versioning 版本控制 自动识别最高版本

青春壹個敷衍的年華 提交于 2020-08-13 04:10:00
Microsoft.AspNetCore.Mvc.Versioning //引入程序集 .net core 下面api的版本控制作用不需要多说,可以查阅 https://www.cnblogs.com/dc20181010/p/11313738.html 普通的版本控制一般是通过链接、header此类方法进行控制,对ApiVersionReader进行设置,例如 services.AddApiVersioning(o => { //o.ReportApiVersions = true ; // 返回版本可使用的版本 o.ApiVersionReader = ApiVersionReader.Combine( new HeaderApiVersionReader( " api-version " ), new QueryStringApiVersionReader( " api-version " ));//通过 Header或QueryString 进行传值来判断api的版本 //o.DefaultApiVersion = new ApiVersion( 1 , 0 ); // 默认版本号 }); 或者使用 https://www.cnblogs.com/tdfblog/p/asp-net-core-api-versioning.html 这种方式

高并发时,使用Redis应注意的问题 及 Redis缓存帮助类

空扰寡人 提交于 2020-08-13 01:52:04
十年河东,十年河西,莫欺少年穷 学无止境,精益求精 缓存的出现解决了数据库压力的问题,但是当以下情况发生的时候,缓存就不在起到作用了, 缓存穿透、缓存击穿、缓存雪崩 这三种情况。 1. 缓存穿透: 我们的程序中用缓存的时候一般采取的是先去缓存中查询我们想要的缓存数据,如果缓存中不存在我们想要的数据的话,缓存就失去了作用(譬如缓存失效),这时我们就是需要伸手向DB库要数据,如果这种动作过多数据库就崩溃了。 这种情况需要我们去预防了,比如说:我们向缓存获取一个用户信息,但是故意去输入一个缓存中不存在的用户Key,这样就避过了缓存,把压力重新转移到数据上面了。 对于这种问题我们可以采取: 因为缓存查不到用户信息,数据库也查询不到用户信息,我们就把访问的数据进行缓存,这时候就可以避免重复访问,顺利把压力重新转向缓存中,有人会有疑问了,当访问的参数有上万个都是不重复的参数,并且都是可以躲避缓存的怎么办,我们同样把数据存起来设置一个较短过期时间清理缓存。 示例代码如下: [HttpGet] [Route( " RedisGet " )] public IActionResult RedisGet( string key) { if (rd.KeyExists(key)) { /* * 如果缓存中存在,则直接返回结果 */ var result = rd.StringGet(key);

JObject对象如何获取深度属性值&不判断key是否存在获取值&获取含有特殊字符的key值

99封情书 提交于 2020-08-12 08:03:23
  前言:我们有时常会用到JObject对象接受数据,并通过JObject快速获取指定key的值,顺序的话是没有问题的,但是假如你遇到如下的JObject对象,该怎么快速获取数据呢? { "details" : { "threeds2.fingerprint": "123" }, "paymentData": "456" }   正常情况下,你如果想获取键:threeds2.fingerprint的值,是怎么获取的?   如下: JObject jobj=Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject> (str); string finger=jobj[ " details " ][ " threeds2.fingerprint " ];   但是这样写是存在风险的。 第一,我们没有加任何key的判断,容易报异常,那么换一种写法: Newtonsoft.Json.Linq.JObject jobj = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject> (str); if (jobj.ContainsKey( " details " )) { Newtonsoft.Json

JWT帮助类(相关方法)

感情迁移 提交于 2020-08-12 01:53:21
注意:首先安装JWT程序包 using System; using System.Collections.Generic; using System.Linq; using System.Web; using JWT; using JWT.Algorithms; //加密算法 using JWT.Builder; using JWT.Exceptions; using JWT.Serializers; namespace WebApplication1.Models {   public class JWTHelper   {     private string Key { get; set; } = "bfdhargrtjuykreawtuyjtretryjgafasdgrth";// 这个密钥     private IJwtAlgorithm algorithm { get; set; } // 这是 HMACSHA256加密算法     private IJsonSerializer serializer { get; set; }// 这是JSON序列化工具     private IBase64UrlEncoder urlEncoder { get; set; } // 这是BASE64编码工具     private IDateTimeProvider

Visual中SqlHelper的书写(*)

微笑、不失礼 提交于 2020-08-12 00:14:25
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Configuration; 6 using System.Data; 7 using System.Data.SqlClient; 插入引用 private static string strconn = ConfigurationManager.ConnectionStrings[ " DigitalProductShopConnectionString " ].ConnectionString; 获取连接 1 public static DataTable ChaXun( string sql) 2 { 3 using (DataTable dt= new DataTable()) 4 { 5 using (SqlDataAdapter sda= new SqlDataAdapter(sql,strconn)) 6 { 7 sda.Fill(dt); 8 } 9 10 return dt; 11 } 12 } 查询方法 1 public static int FeiChaXun( string sql) 2 { 3 int i = 0 ; 4 using

Visionpro相机硬件触发笔记

大兔子大兔子 提交于 2020-08-11 23:39:50
1 using Cognex.VisionPro; 2 using Cognex.VisionPro.FGGigE; 3 using Cognex.VisionPro.FGGigE.Implementation.Internal; 4 using Cognex.VisionPro.ToolBlock; 5 using System; 6 using System.Collections.Generic; 7 using System.ComponentModel; 8 using System.Data; 9 using System.Drawing; 10 using System.Linq; 11 using System.Text; 12 using System.Windows.Forms; 13 14 namespace 康耐视硬件触发测试 15 { 16 public partial class Form1 : Form 17 { 18 CogToolBlock tb = null ; 19 CogAcqFifoTool acq = null ; 20 CogAcqFifoTool tacq = null ; 21 22 private string path = Application.StartupPath + " \\Tool\\ " + " tb.vpp " ;

C# Log4Net学习笔记:记录日志到数据库

主宰稳场 提交于 2020-08-11 15:38:36
一、数据准备 在SQL Server中创建记录日志的数据表LogDetail: CREATE TABLE [ dbo ] . [ LogDetail ] ( [ LogID ] [ INT ] IDENTITY ( 1 , 1 ) NOT NULL , -- 自增ID [ LogDate ] [ DATETIME ] NULL , -- 日志时间 [ LogLevel ] [ NVARCHAR ] ( 10 ) NULL , -- 日志级别 [ LogThread ] [ NVARCHAR ] ( 10 ) NULL , -- 线程ID [ Logger ] [ NVARCHAR ] ( 50 ) NULL , --日志名称 [ LogMessage ] [ NVARCHAR ] ( 3000 ) NULL , -- 日志内容 CONSTRAINT [ PK_LogDetail ] PRIMARY KEY CLUSTERED ( [ LogID ] ASC ) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [ PRIMARY ] ) ON [ PRIMARY ] 在此表中