按这两篇文章部署即可:
ASP.NET Core 缓存(Cache)之 SQL Server 缓存
ASP.NET Core 会话状态(Session State)
存储内容示例:
图中,
第 1 项为浏览器 A 中,在 Session 中设置键 count 值为 3 的结果;
第 3 项为浏览器 B 中,在 Session 中设置键 count 值为 1 的结果;
而第 2 项为设置 Cache 键 count 值为 5 的结果。

* 本文凡使用变量 httpContextAccessor 或 _httpContextAccessor 的地方都需要需要注入 Microsoft.AspNetCore.Http.IHttpContextAccessor
* 在视图(view)中应以 ViewContext 类引出
获取当前页面网址:
using Microsoft.AspNetCore.Http.Extensions;
string url = Request.GetDisplayUrl();
获取当前访问的域名和端口:
获取来源:
Request.GetTypedHeaders().Referer
判断 Scheme 是否为 https:
Request.IsHttps
获取客户端IP和端口、服务器IP和端口:
获取浏览器用户代理(UserAgent):
httpContextAccessor.HttpContext.Request.Headers[HeaderNames.UserAgent];
获取当前请求的唯一标识:
httpContextAccessor.HttpContext.TraceIdentifier
返回结果:80000564-0002-f700-b63f-84710c7967bb
用途:可作为生成随机数的种子。
获取客户端IP地址:
httpContextAccessor.HttpContext.Connection.RemoteIpAddress
获取当前项目根目录磁盘路径:
AppContext.BaseDirectory // 以“\”结尾
注意:此路径到项目根目录,而非网站根目录,网站根目录请自行追加,默认为 wwwroot\
编码/解码:(参数和返回值均为 string?)
using System.Net;
WebUtility.HtmlEncode(myString)
WebUtility.HtmlDecode(myString)
WebUtility.UrlEncode(myString)
WebUtility.UrlDecode(myString)
更多:https://xoyozo.net/Blog/Index/Core

微信的 H5 页面前端引导到:
https://api.magcloud.cc/magshare/{siteId}?jump_url={jump_url}&content_url={content_url}
各参数含义见官方文档:http://doc.magcloud.net/325339
content_url
地址(一般仍为活动页面)接收参数magshareredirect
,值为 1 则跳转到自定义的引导页。自定义引导页按 iOS 和安卓显示图文和箭头,引导用户点击右上角菜单,在浏览器中打开。
在浏览器 H5 中引导打开:
{siteId}://pagejump?jump_url={jump_url}
各参数含义见第 1 步中的文档。
这里涉及一个“若未安装则引导安装”的过程,可以选择下方合适的一种方式实现:
A
标签的href
填入下载地址,onclick
事件location
到 Apponclick
事件location
到 App,再用setTimeOut
location
到下载地址若仍无法实现预期效果,可以在弹出层中放置“未安装,前往下载”和“已安装,立即打开”两个按钮,让用户自己选择
若下载地址为应用宝,那么在 iOS 中可能会出现“打开 App 后继而自动打开 App Store”的情况,可以自建中转的 App 介绍页引导到 App Store 或应用宝。
分别实现微信和 MAGAPP 客户端的分享

苹果 | 安卓 | |
微信小程序 | ✘ | ✘ |
微信小游戏 | ✘ | ✔ |
微信 H5 | 未考证 | 未考证 |
原生 App | ✘ | ✔ |
原生 App 内嵌 H5 | 未考证 | 未考证 |
浏览器 H5 | 未考证 | 未考证 |
* 以上规则仅针对虚拟商品
“✘”是指:不能展现任何有购买、支付的功能、页面、按钮,即使实际上它们都不可使用;也不得引导至外部网站或 APP 来实现支付功能。
“虚拟商品”包括但不限于购买:会员、月卡、代金券、置顶服务。
“引导行为”包括但不限于引导至:App、公众号、H5、个人号、网站、安卓手机。
微信内规则大部分基于 iOS 规则。
任何不被允许的虚拟支付只要能够通过内购实现,那么都变得允许,只不过到手只剩 70%。

完整操作步骤如下:
安装 NuGet 包:
Microsoft.AspNet.Web.Optimization
打开
Views
目录(如果是应用于区域,则为区域的Views
目录)中的 web.config,在<namespaces />
节点中添加<add namespace="System.Web.Optimization" />
在
App_Start
目录中创建类文件BundleConfig.cs
,更改其命名空间为应用程序的默认命名空间(即移除.App_Start
),创建方法:public static void RegisterBundles(BundleCollection bundles) { bundles.Add(new StyleBundle("~/虚拟路径(不能有点)").Include("~/CSS文件路径")); bundles.Add(new ScriptBundle("~/虚拟路径(不能有点)").Include("~/JS文件路径")); }
虚拟路径应避免与页面访问路径相同。Include 可包含多个文件,效果是合并输出,注意引用的顺序。
打开
Global.asax
,在Application_Start()
事件中添加代码BundleTable.EnableOptimizations = true; // 该设置使在开发模式中实现压缩代码,不设置则仅在发布后压缩代码 BundleConfig.RegisterBundles(BundleTable.Bundles);
视图页面中引用样式表或脚本
@Styles.Render("~/CSS虚拟路径") @Scripts.Render("~/JS虚拟路径")
使用 Render 的好处是,ASP.NET 会自动给引用地址加上参数,可在更改脚本或样式表内容后更改这些参数使浏览器缓存立即失效。
如果你的项目中已经安装并使用 Bundle
,那么只需要参考第 4 步,将 BundleTable
的 EnableOptimixations
设为 true
。
以下是一些常见异常的解决方法:
The name 'Styles' does not exist in the current context
The name 'Scripts' does not exist in the current context
解决:参步骤 2。
引用的样式表或脚本不存在(报 404
错误)
解决:步骤 3 中的虚拟路径不规范。

本文讲述使用网页开发适用于宴会、活动、年会现场 LED 大屏幕显示抽奖、抢楼、游戏、视频等互动界面,通过在浏览器中打开后 F11 全屏投影到大银幕上。
设计思路:
为了保证最佳的显示效果,设计稿的尺寸按大屏幕的“宽高比”来做(本文以4米*3米的大银幕为例,设计稿以800*600像素为例)。
由于电脑的视频输出分辨率很有可能与大银幕的宽高比不同,那么我们全屏投影后会界面会有变形,但是投影设备接收到电脑视频信号后再全屏显示到大银幕时,界面又会变回正常。
按设计稿的尺寸开发网页,并使用 CSS3 的 scale 实现整体伸缩,目的是自适应窗口尺寸来全屏显示内容,无留白、无裁切。整体拉伸的要求是文字、图片、背景、间距、iframe 等所有元素以统一的比例拉伸,无错位。
网页上通过 JS 设置一些快捷键来实现页面展示内容的切换。
若投影设备功能有限或操作员水平有限等原因导致无法顺利设置输入输出分辨率时,网页可设置 x 轴和 y 轴两个方向的伸缩系数、定位偏移量等,更灵活地实现完美投影需求。
开发要点:
网页尺寸按设计稿来定(以 800x600 为例)。
使用 CSS3 的 transform 的 scale 来实现缩放,以电脑显示器分辨率 1920x1080,宽放大 1920/800 倍,高放大 1080/600 倍,即可将设计稿全屏展示到电脑显示器上。为了更灵活,我们使用窗口大小来代替显示器分辨率,这样不管怎么改变窗口大小或者全屏,设计稿都能完整地显示在窗口上。
在页面初始化和窗口尺寸变化时重新调整设置上述比例。
代码参考:

如何查看 ASP 详细错误信息
解决办法:
打开 IIS,在相应网站的功能视图中双击“错误页”,在右侧“操作”栏中点击“编辑功能设置…”,将“错误响应”更改为“详细错误”。
在功能视图中双击“ASP”,展开“调试属性”,“将错误发送到浏览器”设为 True。记得在网站调试完成后还原此项设置。
若仍不显示,本地浏览器去掉了“显示 http 友好错误提示”选项。
spacedesk 是一款非常强大的虚拟投影软件,可以将其它电脑、苹果设备(iPhone、iPad)、安卓手机甚至 HTML5 浏览器作为第二屏幕。本文以一台笔记本的屏幕作为另一台笔记本的扩展记录安装配置过程。
主笔记本安装 spacedesk DRIVER
扩展笔记本安装 spacedesk VIEWER
为了保证屏幕最佳的显示效果,我们希望两台笔记本最终的显示分辨率与物理分辨率一致。
我的主笔记本分辨率 1920x1080,扩展笔记本分辨率 1366x768
主笔记本
首先在扩展笔记本中打开 spacedesk VIEWER,连接主笔记本。
在主笔记本,桌面右键“显示设置”,分别针对 1 和 2 显示器设置分辨率:
当然还可以在上上图中的“重新排列显示器”中拖动来实现屏幕内容的显示位置。
扩展笔记本
打开 spacedesk VIEWER,在菜单的 Settings 中选择 Resolutions 可设置显示分辨率:
选择 Compression Quality 可设置显示质量:
压缩(Compression)如果选择 Off,那得看你的电脑能否吃得消,否则显示效果会更卡。我的配置是压缩选择 On,颜色深度选择低,快速,质量 100,帧率选择 60 FPS:
这样比默认设置的显示效果要好很多。
如果有条件用有线连接的话,尽量不要用无线连接,能减少不少延时。

一般地,我们会设置网站中的图片文件仅允许本网站页面调用,或者开放地址栏直接打开,但不允许其它网站调用。
这就需要在 Web 服务器上判断图片的来源(Referer)。
但是,当网站页面是 https,而图片地址是 http 时,考虑到安全性,浏览器将不带 Referer,这时如果图片允许在地址栏直接打开(即 Referer 为空),就起不到防盗链的作用了。
所以图片服务器在处理防盗链时,尽量不要允许 Referer 为空时调用。这时如果要单独允许另一个网站来调用图片,应该使用一致的 protocol。

一、显示信息的命令
console.log("normal"); // 用于输出普通信息 console.info("information"); // 用于输出提示性信息 console.error("error"); // 用于输出错误信息 console.warn("warn"); // 用于输出警示信息
二、点位符:字符(%s)、整数(%d或%i)、浮点数(%f)和对象(%o);
console.log("%s","string"); //字符(%s) console.log("%d年%d月%d日",2016,8,29); //整数(%d或%i) console.log("圆周率是%f",3.1415926); //浮点数(%f) var dog = {}; dog.name = "大毛"; dog.color = "黄色"; dog.sex = "母狗"; console.log("%o",dog); //对象(%o)
三、信息分组 (console.group(),console.groupEnd())
console.group("第一组信息"); console.log("第一组第一条:我的博客"); console.log("第一组第二条:CSDN"); console.groupEnd(); console.group("第二组信息"); console.log("第二组第一条:程序爱好者QQ群"); console.log("第二组第二条:欢迎你加入"); console.groupEnd();
四、将对象以树状结构展现 (console.dir()可以显示一个对象所有的属性和方法)
var info = { name : "Alan", age : "27", grilFriend : "nothing", getName : function(){ return this.name; } } console.dir(info);
五、显示某个节点的内容 (console.dirxml()用来显示网页的某个节点(node)所包含的html/xml代码)
var node = document.getElementById("info"); node.innerHTML += "<p>追加的元素显示吗</p>"; console.dirxml(node);
六、判断变量是否是真 (console.assert()用来判断一个表达式或变量是否为真,只有表达式为false时,才输出一条相应作息,并且抛出一个异常)
var testObj = false; console.assert(testObj, '当testObj为false时才输出!');
七、计时功能 (console.time()和console.timeEnd(),用来显示代码的运行时间)
console.time("控制台计时器"); for(var i = 0; i < 10000; i++){ for(var j = 0; j < 10000; j++){} } console.timeEnd("控制台计时器");
八、性能分析performance profile (就是分析程序各个部分的运行时间,找出瓶颈所在,使用的方法是console.profile()和console.proileEnd();)
function All(){ // alert(11); for(var i = 0; i < 10; i++){ funcA(100); } funcB(1000); } function funcA(count){ for(var i = 0; i < count; i++){}; } function funcB(count){ for(var i = 0; i < count; i++){}; } console.profile("性能分析器"); All(); console.profileEnd();
详细的信息在chrome控制台里的"profile"选项里查看
九、console.count()统计代码被执行的次数
function myFunction(){ console.count("myFunction 被执行的次数"); } myFunction(); //myFunction 被执行的次数: 1 myFunction(); //myFunction 被执行的次数: 2 myFunction(); //myFunction 被执行的次数: 3
十、keys和values,要在浏览器里输入
十一、console.table表格显示方法
var mytable = [ { name: "Alan", sex : "man", age : "27" }, { name: "Wu", sex : "gril", age : "28" }, { name: "Tao", sex : "man and gril", age : "29" } ] console.table(mytable);
十二、Chrome 控制台中原生支持类jQuery的选择器,也就是说你可以用$加上熟悉的css选择器来选择DOM节。
$("body"); //选择body节点
十三、copy通过此命令可以将在控制台获取到的内容复制到剪贴板
copy(document.body); //复制body copy(document.getElementById("info")); //复制某id元素的的节点
十四、$_命令返回最近一次表达式执行的结果,$0-$4代表了最近5个你选择过的DOM节点
十五、利用控制台输出文字,图片,以%c开头,后面的文字就打印的信息,后面一个参数就是样式属性;
console.log("请在邮件中注明%c 来自:console","font-size:16px;color:red;font-weight:bold;");