众所周知,VMware Workstation 中分配的硬盘大小与实际的 .vmdk 文件尺寸是不一致的。
譬如为虚拟机创建了一块 60GB 的硬盘,安装完系统后使用了 20GB 的空间,此时在宿主机上查看到的 .vmdk 的大小是 20GB。
当虚拟机的磁盘空间不足时,可以在 VMware 中扩展容量或添加硬盘。
扩展容量:虚拟机 - 设置 - 硬件 - 硬盘 - 扩展 - 设置最大磁盘大小。譬如设置为 160GB,那么虚拟机的磁盘 0 的大小会变成 160GB,C 盘 60GB 不变,在磁盘管理中可以将未分配的 100GB 创建为 D 盘。
添加硬盘:虚拟机 - 设置 - 硬件 - 添加 - 硬盘 - 设置最大磁盘大小。譬如设置为 100GB,那么虚拟机会增加一块大小为 100GB 的磁盘 1,在磁盘管理中可以将它创建为 100GB 的 D 盘。
当虚拟机内删除文件后,观察到 .vmdk 文件的大小并没有相应地减小,网上搜索后找到很多办法,但未测试成功。索性删除并重装系统比较方便,如果虚拟机里安装了许多软件不方便重装的朋友继续研究。今天终于发现原来 VMware 自带就有磁盘清理功能:虚拟机 - 管理 - 清理磁盘。

“安装 VMware Tools”灰色无法点击。

打开虚拟机设置 - CD/DVD - 使用 ISO 映像文件,浏览到 VM 安装目录,根据对应操作系统选择镜像即可(如 linux.iso、windows.iso)

这样,虚拟机的计算机界面就会出现 VMware Tools 的安装包。

无法完成向远程代理 URL 发送请求。基础连接已经关闭:发送时发生错误。
解决办法:
IIS中“管理服务”的SSL证书过期了,停止,选择新证书,应用,启动。
如果证书名称都相同(例如“alias”),可以先选中一个启动,在 VS Web 部署的设置中验证连接,弹出“证书错误”,点击“查看详细信息”,检查“颁发给”中的域名是否正确,正确的话安装证书。

如果在发布的时候遇到以下错误:
资产文件“\obj\project.assets.json”没有“net6.0”的目标。确保已运行还原,且“net6.0”已包含在项目的 TargetFrameworks 中。在发布设置中更改正确的目标框架版本即可。
| LigerShark.WebOptimizer.Core | BuildBundlerMinifier | |
| 特点 | 在运行时捆绑和缩小 CSS 和 JavaScript 文件 具有完整的服务器端和客户端缓存,以确保高性能 可禁用缩小 支持使用通配模式 标记帮助程序与缓存破坏 支持内联 支持 SCSS | 将 CSS、JavaScript 或 HTML 文件捆绑到单个输出文件中 保存源文件会自动触发重新捆绑 支持通配模式 支持 CI 方案的 MSBuild 支持 缩小单个或捆绑的 CSS、JavaScript 和 HTML 文件 每种语言的缩小选项是可定制的 打开生成的文件时显示水印 任务运行程序资源管理器集成 命令行支持 快捷更新解决方案中所有捆绑包 禁止生成输出文件 转换为 Gulp |
| 注入(Program.cs) | services.AddWebOptimizer(); app.UseWebOptimizer(); | |
| 指定捆绑的项目 | 在运行时自动缩小 css 和 js,也可以在 AddWebOptimizer 中自定义。默认情况下,生成的文件不会保存到磁盘,而是保存在缓存中。 | 手动编辑 bundleconfig.json 文件来指定需要合并和缩小的文件 |
| 功能配置 | | 在 bundleconfig.json 捆绑时设置 |
| 热重载(在开发模式中保存文件自动更新浏览器效果) | VS 安装扩展,方法:菜单 - 扩展 - 管理扩展 - 联机 搜索“Bundler & Minifier” | |
| 其它资料 | ASP.NET 官方文档 |
错误 Web 部署任务失败。
在远程计算机上处理请求时出错。
无法执行此操作。请与服务器管理员联系,检查授权和委派设置。
原因:WDeployAdmin 与 WDeployConfigWriter 这两个用户密码过期。
解决方法:
第一步,打开用户管理,重新设置这两个用户的密码

并在“属性”窗口勾选“密码永不过期”

第二步,打开 IIS 管理器中的“管理服务委派”

找到所有与这两个用户有关的项,右键“编辑”

点击左下角的“设置”按钮,填入与原来一致的用户名与第一步新设置的密码

全部设置完成后,即可正常发布项目。
外星人笔记本电脑键盘突然失灵(我的是 m15 R6),尝试过重启电脑、长按电源键(强制关机、切换电脑性能)、卸载键盘驱动、BIOS 恢复默认设置都没有效果。多次尝试后恢复正常,总结经验:
办法一:关机、拔掉电源、插上电源、再开机,就能恢复正常。
办法二:长按电源键直到关机成功,长按电源键直至开机完成。
若无效,强制关机、插拔电源,多试几次。
总之,这电脑不用的时候尽量关机,直接合上盖子会出现自动苏醒、键盘失灵等一系列问题。
2023年9月补充,最近发现直接合上盖子没有出现自动苏醒,先睡眠再拔电源也没有出现苏醒,可能与我经常在 Alienware Update 和 SupportAssist 中更新驱动和固件有关。
2024年6月补充,出现键盘失灵可以试试合上盖子再打开,大概率能恢复。
本文使用 ASP.NET 6 版本 Senparc.Weixin.Sample.MP 示例项目改造。
第一步 注册多公众号
方法一:打开 appsettings.json 文件,在 SenparcWeixinSetting 节点内添加数组节点 Items,该对象类型同 SenparcWeixinSetting。
//Senparc.Weixin SDK 设置
"SenparcWeixinSetting": {
"IsDebug": true,
"Token": "",
"EncodingAESKey": "",
"WeixinAppId": "",
"WeixinAppSecret": "",
"Items": [
{
"IsDebug": true,
"Token": "a",
"EncodingAESKey": "a",
"WeixinAppId": "a",
"WeixinAppSecret": "a"
},
{
"IsDebug": true,
"Token": "b",
"EncodingAESKey": "b",
"WeixinAppId": "b",
"WeixinAppSecret": "b"
}
]
}方法二:修改 Program.cs 文件,在 UseSenparcWeixin 方法中注册多个公众号信息。
var registerService = app.UseSenparcWeixin(app.Environment,
null /* 不为 null 则覆盖 appsettings 中的 SenparcSetting 配置*/,
null /* 不为 null 则覆盖 appsettings 中的 SenparcWeixinSetting 配置*/,
register => { /* CO2NET 全局配置 */ },
(register, weixinSetting) =>
{
//注册公众号信息(可以执行多次,注册多个公众号)
//register.RegisterMpAccount(weixinSetting, "【盛派网络小助手】公众号");
foreach (var mp in 从数据库或配置文件中获取的公众号列表)
{
register.RegisterMpAccount(new SenparcWeixinSetting
{
//IsDebug = true,
WeixinAppId = mp.AppId,
WeixinAppSecret = mp.AppSecret,
Token = mp.Token,
EncodingAESKey = mp.EncodingAeskey,
}, mp.Name);
}
});完成后,我们可以从 Config.SenparcWeixinSetting.Items 获取这些信息。
第二步 接入验证与消息处理
打开 WeixinController 控制器,将构造函数改写为:
public WeixinController(IHttpContextAccessor httpContextAccessor)
{
AppId = httpContextAccessor.HttpContext!.Request.Query["appId"];
var MpSetting = Services.MPService.MpSettingByAppId(AppId);
Token = MpSetting.Token;
EncodingAESKey = MpSetting.EncodingAESKey;
}示例中 Services.MPService.MpSettingByAppId() 方法实现从 Config.SenparcWeixinSetting.Items 返回指定 appId 的公众号信息。
为使 IHttpContextAccessor 注入生效,打开 Program.cs,在行
builder.Services.AddControllersWithViews();下方插入
builder.Services.AddHttpContextAccessor();这样,我们就可以在构造函数中直接获取地址栏中的 appId 参数,找到对应的公众号进行消息处理。
第三步 消息自动回复中的 AppId
打开 CustomMessageHandler.cs,将
private string appId = Config.SenparcWeixinSetting.MpSetting.WeixinAppId;
private string appSecret = Config.SenparcWeixinSetting.MpSetting.WeixinAppSecret;替换为:
private string appId = null!;
private string appSecret = null!;并在构造函数中插入
appId = postModel.AppId;
appSecret = Services.MPService.MpSettingByAppId(postModel.AppId).WeixinAppSecret;这样,本页中使用的 appId / appSecret 会从 postModel 中获取,而非默认公众号。postModel 已在 WeixinController 中赋值当前的 appId。
改造后,我们可以在 OnTextRequestAsync() 等处理消息的方法中可以判断 appId 来处理不同的消息。
第四步 其它功能和接口
其它功能和接口均可用指定的 AppId 和对应的 AppSecret 进行调用。




