当 MySQL 中使用 tinyint(1) 作为布尔值类型时,ASP.NET Core DBFirst 创建模型时会将其定义为 sbyte,运行时会抛出异常:
InvalidCastException: Unable to cast object of type 'System.Boolean' to type 'System.SByte'.
我们可以在数据库连接字符串中加入 TreatTinyAsBoolean=false 来实现不抛出异常,但程序中赋值和判断该字段时还是会比较麻烦。
因此我更倾向于将数据库中该字段类型改为 bit(1)。
2019.11.28 注:这回遇到 tinyint(1) 映射到了 C# 的 bool,而 bit(1) 却映射到了 ulong。具体什么原因未作排查,反正哪个最终为 bool 就选哪个吧。
本文使用 Pomelo 提供的 Pomelo.EntityFrameworkCore.MySql,如使用 MySql.Data.EntityFrameworkCore 请移步。
对比 MySql.Data.EntityFrameworkCore 与 Pomelo.EntityFrameworkCore.MySql
本文以 Visual Studio 2019、ASP.NET Core 3.0 开发环境为例。
新建 ASP.NET Core Web 应用程序。
安装 NuGet 包:
Microsoft.EntityFrameworkCore.Tools
Pomelo.EntityFrameworkCore.MySql(3.0.0 预发行版以上)

根据已有数据库创建数据模型。在 NuGet 的程序包管理(Package Manager)控制台中(PowerShell)执行命令:
Scaffold-DbContext "server=数据库服务器;uid=数据库用户名;pwd=数据库密码;database=数据库名;" Pomelo.EntityFrameworkCore.MySql -OutputDir Data -Force.Net Core CLi:
dotnet ef dbcontext scaffold "server=数据库服务器;uid=数据库用户名;pwd=数据库密码;database=数据库名;" Pomelo.EntityFrameworkCore.MySql -o Data -f搞定。
补充:其它数据库提供程序请参考:https://docs.microsoft.com/zh-cn/ef/core/providers/
代码参数说明:
-OutputDir (-o) *** 实体文件所存放的文件目录
-ContextDir *** DbContext文件存放的目录
-Context *** DbContext文件名
-Schemas *** 需要生成实体数据的数据表所在的模式
-Tables(-t) *** 需要生成实体数据的数据表的集合
-DataAnnotations
-UseDatabaseNames 直接使用数据库中的表名和列名(某些版本不支持)
-Force (-f) 强制执行,重写已经存在的实体文件
更多高级用法请参考官方文档。
微信的 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,再用setTimeOutlocation到下载地址若仍无法实现预期效果,可以在弹出层中放置“未安装,前往下载”和“已安装,立即打开”两个按钮,让用户自己选择
若下载地址为应用宝,那么在 iOS 中可能会出现“打开 App 后继而自动打开 App Store”的情况,可以自建中转的 App 介绍页引导到 App Store 或应用宝。
分别实现微信和 MAGAPP 客户端的分享
| 型号 | 传输速率 | 带宽 | 类型 | 相对于上一类的优势 |
| 一类线(CAT1) | - | - | 非屏蔽/屏蔽 | 传输语音 |
| 二类线(CAT2) | 4Mbps | 1MHz | 非屏蔽/屏蔽 | 可传输数据 |
| 三类线(CAT3) | 10Mbps | 16MHz | 非屏蔽/屏蔽 | 速度提升 |
| 四类线(CAT4) | 16Mbps | 20MHz | 非屏蔽/屏蔽 | 速度提升 |
| 五类线(CAT5) | 100Mbps | 100MHz | 非屏蔽/屏蔽 | 增加密度、绝缘材料 |
| 超五类(CAT5e) | 1Gbps | 100MHz | 非屏蔽为主 | 衰减小、串扰少 |
| 六类线(CAT6) | 1Gbps / 10Gbps(55米内) | 250MHz | 非屏蔽/屏蔽 | 内部通常有十字骨架,全双工,改善串扰及回波损耗 |
| 超六类(CAT6A) | 10Gbps | 500MHz | 屏蔽为主 | 通常带屏蔽层,改善串扰、衰减、信噪比等 |
| 七类线(CAT7) | 10Gbps | 600MHz | 屏蔽 | 每对线对单独屏蔽+总屏蔽,适应万兆位以太网技术 |
| 八类线(CAT8) | 25Gbps / 40Gbps(30米内) | 2000MHz | 屏蔽 | 专为短距离高速连接设计 |
普通家庭装修布线建议上到千兆网络(2019年),至少选择六类网线。
计划构建万兆内网的,至少选择超六类。
You could try using --skip-broken to work around the problem
……
curl-7.54.0-1.el7.centos.x86_64 is a duplicate with curl-7.29.0-35.el7.centos.x86_64
解决方法:
yum remove curl-7.29.0-35.el7.centos.x86_64
yum install curl
实测上面的方法无法安装 curl
在编程或生成时,我们可能会遇到如下错误:
推断出元组元素名称“category”。请使用语言版本 7.1 或更高版本按推断名称访问元素。
那么打开项目属性,切换到“生成”选项卡,“配置”选择“所有配置”。
页面往下拉,打开“高级”窗口,默认是“C# 最新主要版本(默认)”,我们选择“C# 最新次要版本(最新)”,确定。
ASP.NET Web API 返回 Unauthorized 401 未授权代码:
return Unauthorized(new AuthenticationHeaderValue("getUserInfo"));响应的头部信息是这样的:

以微信小程序中获取 header 的 www-authenticate 为例,不同操作系统中获取的 key 是不一样的:
iOS:

Android:

微信开发者工具:

所以,小程序端获取该值,暂时使用以下代码吧:
let www_authenticate;
if (!www_authenticate) {
www_authenticate = res.header['Www-Authenticate']; // iOS
}
if (!www_authenticate) {
www_authenticate = res.header['WWW-Authenticate']; // Android / 微信开发者工具
}
if (!www_authenticate) {
www_authenticate = res.header['www-authenticate']; // ASP.NET Web API 原始输出
}
if (!www_authenticate) {
www_authenticate = res.header['WWW-AUTHENTICATE']; // 其它情况
}
完整操作步骤如下:
安装 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 中的虚拟路径不规范。
设置 CarPlay 车载
请按照以下步骤开始操作:
确保您所在的地区支持 CarPlay 车载,且您的汽车支持 CarPlay 车载。
启动您的汽车,然后确保 Siri 已打开。
将 iPhone 与汽车相连:
如果您的汽车支持通过 USB 连接线连接 CarPlay 车载,请将您的 iPhone 插接到车内的 USB 端口。这类 USB 端口可能标有 CarPlay 车载图标或智能手机图标。
如果您的汽车支持无线 CarPlay 车载,请按住方向盘上的语音命令按钮。确保您的立体声系统处于无线或蓝牙模式。然后,在您的 iPhone 上前往“设置”>“通用”>“CarPlay 车载”,轻点“可用的汽车”,然后选择您的汽车。请查看您的汽车使用手册,以了解更多信息。
之前已经介绍了百度编辑器在 ASP.NET 环境下的配置,本文继续补充改进其将图片等附件上传到阿里云 OSS。
首先从阿里云控制台下载相关 SDK,并阅读相关的 API 文档。链接:https://promotion.aliyun.com/ntms/act/ossdoclist.html
改造上传代码
打开文件 UploadHandler.cs,在 Process() 方法中找到:
File.WriteAllBytes(localPath, uploadFileBytes);在其下方插入代码:
client.PutObject(bucketName, "upload/ueditor/" + savePath, localPath);实现图标按钮上传和 HTML5 拖放上传。
PutObject() 的第 2 个参数是 OSS 中的图片路径,第 3 个参数是图片在网站目录下的磁盘路径。
打开文件 CrawlerHandler.cs,在 Fetch() 方法中找到:
File.WriteAllBytes(savePath, bytes);在其下方插入代码:
client.PutObject(bucketName, "upload/ueditor/" + ServerUrl, savePath);实现粘贴板图片上传。
同样注意两个参数变量。
修改路径前缀
上传成功后,编辑器会拼装路径到 HTML 代码中,这个前缀是在 config.json 文件中配置的,具体找到以 UrlPrefix 结尾的属性,如 imageUrlPrefix,进行相应的修改即可:
"imageUrlPrefix": "//oss.xoyozo.net/upload/ueditor/", /* 图片访问路径前缀 */路径以“//”开头能更好地兼容 https。
