博客 (39)

以下列出本人所遇到的情况及处理方法,肯定不全,但都有用。

  1. 使用系统自带清理工具进行清理

    Windows 7 / 8 / 8.1 / 10:在 C 盘上点击右键属性 - 磁盘清理 - 清理系统文件 - 视情况勾选 - 确定

    Windows 11:在 C 盘上点击右键属性 - 详细信息 - 临时文件 - 视情况勾选 - 确定

  2. 关闭“传递优化

    设置 - Windowx 更新 - 高级选项 - 传递优化,关闭“允许从其他设备下载”

    其实前面说到的清理临时文件中已经包含了“传递优化文件”,所以这里按个人喜好选择是否关闭。

  3. 更改虚拟内存路径

    可以将虚拟内存路径更改为非系统盘,但建议是固态硬盘。

  4. 关闭系统还原

    当遇到系统问题时,如果你喜欢重装系统,而不是系统还原,那么可以关闭它。

  5. 更改桌面、文档、下载等用户文件夹的位置

    将这些目录路径更改到非系统,但仍然建议是固态硬盘。以 Windows 11 的桌面目录为例:

    打开资源管理器 - 主文件夹,右键点击“桌面”属性,切换到“位置”,移动。

  6. 软件安装到其它盘

    有些电脑管理软件有软件迁移功能,但我还是建议先卸载软件,再安装到其它盘符。

  7. 将软件文档路径更改到其它盘

    如果不想把软件安装到其它盘(譬如只有C盘是固态硬盘),那么可以将文档路径更改到其它盘,譬如:

    微信:☰ - 设置 - 文件管理 - 更改

    QQ:☰ - 设置 - 存储管理 - 更改存储路径(注意是聊天消息那个)

    企业微信:头像 - 设置 - 存储管理

    钉钉:头像 - 设置与隐私 - 通用 - 缓存目录

    千牛:设置 - 数据存储文件夹

  8. 清理浏览器缓存

    Chrome:┇ - 设置 - 隐私与安全 - 删除浏览数据

    Edge:… - 设置 - 隐私、搜索和服务 - 删除浏览记录 - 选择要清除的内容

    Firefox:☰ - 设置 - 隐私与安全 - 历史记录 - 清除历史记录

  9. VMware 虚拟机

    在已安装的镜像上点击右键 - 管理 - 清理磁盘

    把已安装的镜像复制到其它磁盘,再添加到 VMware 中,删除原镜像文件。

  10. 更改 Navicat 数据库备份目录

    如果你的 Navicat 启用了自动运行的备份任务,那么可以更改备份路径。

    在连接上点击右键编辑连接,切换到高级,更改设置位置。

  11. SQL Server 数据库文件瘦身

    若 SQL Server 数据目录(C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA)中有很多较大的数据库日志文件(.ldf),可以按需采取以下措施:

    使用 SSMS 连接到你的 SQL Server 实例;数据库恢复模式设置为“简单”;右键点击要压缩的数据库,选择“任务”->“收缩”->“文件”,选择“日志”,在“释放未使用的空间前重新组织页”一项中设置为 0MB,然后点击“确定”按钮。

最后推荐一款免费软件 TreeSize Free,可以查看磁盘中各目录和文件占用空间大小,小白不要乱删文件哦,删错了可就得重装系统了。

xoyozo 4 天前
79

连接 Filezilla Server 时提示“服务器的证书未知。请小心验证证书以确信该服务器可信任。”

image.png

解决办法:登录服务器,打开 Administrator FileZilla Server,菜单中选择 Server,Configure,点击左侧的 Administration,切换到 Connection security 页,点击 Generate new 按钮,OK。

image.png

Protocols settings 的 FTP and FTP over TLS(FTPS) 中同样也需要点击 Generate new。

xoyozo 半个月前
110

先在网页版上找到并进入这个直播间,再点 Windows 版客户端上的刷新按钮,就会显示这个直播了。

xoyozo 3 个月前
336

微信网页开发 JS-SDK 官方文档介绍的获取地理位置接口示例是这样的:

wx.getLocation({
  type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
  success: function (res) {
    var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
    var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
    var speed = res.speed; // 速度,以米/每秒计
    var accuracy = res.accuracy; // 位置精度
  }});

实际上是这样的:

wx.getLocation({
  type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
  success: function (res) {
    // 网页位置信息授权点击“确定”按钮,以及允许后继续获取定位信息
  },
  fail: function (err) {
    // 获取定位信息失败(譬如:网页位置信息已授权,但操作系统定位已关闭)
  },
  cancel: function (err) {
    // 网页位置信息授权点击“拒绝”按钮
  }
});

顺便提一下如何关闭网页授权:

进入网页使用 JS-SDK 的公众号(可以在授权弹框中看到服务号名称),点击右上角人形图标,继续点击右上角三个点图标,选择设置,关闭“位置信息”。

授权框.png公众号设置.png

xoyozo 6 个月前
570

SignalR 是一个开源的实时通信库,用于构建实时 Web 应用程序。它提供了一个简单的 API,可以在客户端和服务器之间建立持久连接,以便实时地推送数据。

与传统的 WebSocket 相比,SignalR 提供了更高级的功能和更简单的开发体验。下面是一些主要区别:

  • 支持多种传输方式:SignalR 可以使用多种传输方式,包括 WebSocket、Server-Sent Events(SSE)、长轮询和 Forever Frame。这使得 SignalR 在不同的环境中都能提供实时通信的能力,即使某些浏览器不支持 WebSocket,也可以使用其他传输方式。

  • 自动处理连接管理:SignalR 管理连接的生命周期,包括连接的建立、断开和重新连接。它会自动处理连接的失败和重新连接的逻辑,简化了开发人员的工作。

  • 服务器端推送:SignalR 允许服务器端主动推送消息给客户端,而不需要客户端发起请求。这使得实时通信变得更加高效和实时,适用于聊天应用、实时监控等场景。

  • 跨平台支持:SignalR 可以在多个平台上使用,包括 .NET、Java、JavaScript 等。这使得开发人员可以使用自己熟悉的语言和框架来构建实时应用程序。


微软官方提供了针对 ASP.NET Core Web 应用(Razor 页面)的详细教程,这里给出 MVC 版本入门教程。


最终将创建一个正常运行的聊天应用:

signalr-get-started-finished.png


创建 Web 应用项目

image.png

image.png


添加 SignalR 客户端库

在“解决方案资源管理器”>中,右键单击项目,然后选择“添加”“客户端库”。

在“添加客户端库”对话框中:

  • “提供程序”选择“unpkg”

  • “库”,请输入 @microsoft/signalr@latest。

  • 选择“选择特定文件”,展开“dist/browser”文件夹,然后选择 signalr.js 和 signalr.min.js。

  • 点击“安装” 。

image.png


创建 SignalR Hubs 类

using Microsoft.AspNetCore.SignalR;

/// <summary>
/// Hub 类管理连接、组和消息
/// </summary>
public class ChatHub : Hub
{
        /// <summary>
        /// 可通过已连接客户端调用 SendMessage,以向所有客户端发送消息
        /// </summary>
    public async Task SendMessage(string user, string message)
    {
        // Clients.All 向所有的客户端发送消息
        // ReceiveMessage 是客户端监听的方法
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

其父类 Hub 可管理连接、组和消息。这里演示的是向所有客户端发送消息。


配置 SignalR

打开 Program.cs,添加注入:

builder.Services.AddSignalR();

添加路由:

app.MapHub<ChatHub>("/chatHub");


添加 SignalR 客户端代码

视图页面:

<div class="container">
    <div class="row p-1">
        <div class="col-1">用户</div>
        <div class="col-5"><input type="text" id="userInput" /></div>
    </div>
    <div class="row p-1">
        <div class="col-1">消息</div>
        <div class="col-5"><input type="text" class="w-100" id="messageInput" /></div>
    </div>
    <div class="row p-1">
        <div class="col-6 text-end">
            <input type="button" id="sendButton" value="发送消息" />
        </div>
    </div>
    <div class="row p-1">
        <div class="col-6">
            <hr />
        </div>
    </div>
    <div class="row p-1">
        <div class="col-6">
            <ul id="messagesList"></ul>
        </div>
    </div>
</div>
<script src="~/lib/microsoft/signalr/dist/browser/signalr.min.js"></script>
<script src="~/js/chat.js"></script>

chat.js 文件:

"use strict";

var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();

// 在连接建立之前禁用发送按钮
document.getElementById("sendButton").disabled = true;

connection.on("ReceiveMessage", function (user, message) {
    var li = document.createElement("li");
    document.getElementById("messagesList").appendChild(li);
    // 修改此处时应注意脚本注入问题
    li.textContent = `${user} says ${message}`;
});

connection.start().then(function () {
    document.getElementById("sendButton").disabled = false;
}).catch(function (err) {
    return console.error(err.toString());
});

document.getElementById("sendButton").addEventListener("click", function (event) {
    var user = document.getElementById("userInput").value;
    var message = document.getElementById("messageInput").value;
    connection.invoke("SendMessage", user, message).catch(function (err) {
        return console.error(err.toString());
    });
    event.preventDefault();
});


完成。在线示例:https://xoyozo.net/Demo/SignalRDemo






xoyozo 1 年前
1,344

本文由 ChatGTP 3.5 提供


在 .NET C# 桌面应用程序中,你可以使用委托和事件来实现在窗体页面处理事务过程中实时更新界面。下面是一个示例,展示了在不同情况下如何更新主界面:

首先,在窗体页面中定义一个委托和一个事件,用于更新界面:

public delegate void UpdateUIHandler(string msg);
public event UpdateUIHandler UpdateUIEvent;

然后,在窗体的构造函数中订阅事件,并在事件处理程序中更新界面:

public Form1()
{
    InitializeComponent();
    UpdateUIEvent += UpdateUI;
}

private void UpdateUI(string msg)
{
    if (InvokeRequired)
    {
        Invoke(new UpdateUIHandler(UpdateUI), msg);
    }
    else
    {
        // 在这里更新界面
        label1.Text = msg;
    }
}

现在,你可以在窗体页面的任何地方调用 UpdateUIEvent 来触发更新界面的事件。例如,在按钮点击事件中:

private void button1_Click(object sender, EventArgs e)
{
    // 处理事务过程中实时更新界面
    string msg = "处理事务中...";
    UpdateUIEvent?.Invoke(msg);

    // 异步调用一个类方法中的方法,并在方法内部实时更新主界面
    Task.Run(() =>
    {
        MyClass myClass = new MyClass();
        myClass.LongRunningMethod(UpdateUIEvent);
    });
}

在上面的示例中,MyClass 是一个自定义的类,其中的 LongRunningMethod 是一个耗时的方法。在这个方法内部,你可以通过传递 UpdateUIEvent 来实时更新主界面:

public class MyClass
{
    public void LongRunningMethod(UpdateUIHandler updateUI)
    {
        // 处理事务过程中实时更新界面
        string msg = "处理事务中...";
        updateUI?.Invoke(msg);

        // 其他耗时操作...
    }
}

通过以上示例,你可以在窗体页面处理事务过程中实时更新界面,并且在异步调用的方法内部也能实时更新主界面。记得在更新界面时使用 Invoke 方法,以确保在主线程上更新界面,避免跨线程访问 UI 的问题。

xoyozo 1 年前
1,212

在 Vue 中,当你将一个布尔对象双向绑定到 radio 输入上时,确保 radio 的 value 属性仍然保持布尔类型是很重要的。如果 value 属性是字符串,那么 Vue 会将其解释为字符串而不是布尔值。以下是一个示例,演示如何正确地将布尔对象双向绑定到 radio 按钮,并确保 value 属性保持布尔类型:

<template>
  <div>
    <input type="radio" v-model="myBoolean" :value="true" /> True
    <input type="radio" v-model="myBoolean" :value="false" /> False
    <p>myBoolean: {{ myBoolean }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      myBoolean: false, // 布尔对象
    };
  },
};
</script>

在这个示例中,我们使用了 v-model 指令将 myBoolean 属性与两个 radio 按钮进行了双向绑定。通过将 value 属性设置为 true 和 false,我们确保了 myBoolean 属性保持布尔类型。

这样,当用户选择其中一个 radio 按钮时,myBoolean 属性将保持布尔值而不是字符串。确保 value 属性的类型与要绑定的数据类型匹配,以确保绑定的数据类型保持一致。

同样的问题出现在 select 上也是一样:

<select v-model="cat.colorId" required>
    <option :value="null">不选择</option>
    <option v-for="color in colors" :value="color.id">{{color.name}}</option>
</select>


xoyozo 1 年前
1,245

首先我们要获取公众号的“__biz”值

在电脑浏览器上打开该公众号的任何一篇历史文章,在源代码中搜索“__biz=”就可以找到,该值以“==”结尾,例如找到:

__biz=MzIwNDcwODQ2NQ==

那么就可以拼成网址:(只能在微信中打开)

https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzIwNDcwODQ2NQ==#wechat_redirect

早期这个地址是这样的:

https://mp.weixin.qq.com/mp/getmasssendmsg?__biz=MzIwNDcwODQ2NQ==#wechat_redirect

现在它重定向到第一个地址去了,所以直接用新的就可以了。

若提示“页面无法打开”,可能的原因是没有加“#wechat_redirect”。

xoyozo 2 年前
1,500

错误 Web 部署任务失败。

在远程计算机上处理请求时出错。

无法执行此操作。请与服务器管理员联系,检查授权和委派设置。

原因:WDeployAdmin 与 WDeployConfigWriter 这两个用户密码过期。

解决方法:

第一步,打开用户管理,重新设置这两个用户的密码

image.png

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

image.png

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

image.png

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

image.png

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

image.png

全部设置完成后,即可正常发布项目。

xoyozo 2 年前
1 Comments 3,452

IMG_1452.PNG

文件已正常部署且能正常访问到,但点击“文件已部署,立即认证”按钮时,然后被提示:访问文本资源失败,请调整后重试。原因是微信验证请求是 http 协议,如果网站强制启用 https 则无法完成验证。

在 ASP.NET 6 中可打开 Program.cs 文件,临时注释掉下行即可:

app.UseHttpsRedirection();


xoyozo 3 年前
3,217