背景
客户新提需求,需要增加一张报表,报表需要增加统计图表。因为客户需要将数据以及统计图表一并导出到word中,所以没有使用前端统计相关的类库,比如:echarts、highcharts等库。虽然可以使用前端相关类库导出word,但是并不能满足现有需求。后台服务使用的是.net 5,统计图完成后发现中文出现乱码。如下图:
问题
出现以上乱码问题,其一可能是统计类库不支持中文导致的,也有可能是docker镜像中缺少相应的中文字体。因为在本地开发环境测试并没有问题,更新到测试环境后才发现以上乱码情况,所以应该是镜像中缺少相关中文字体而导致的。
解决
既然是缺少中文字体,那就安装字体就行了。在Windows系统中复制需要的字体到新建名称为chinese文件夹下,将此文件夹放到与dockerfile同一目录下即可。dockerfile文件中新增内容如...
1年前 (2023-09-24) 1135℃ 0评论
1喜欢
背景
最初,由于购买cc域名不支持备案,所以就使用了阿里云香港云空间。自从2016年网站应用由.net应用BlogEngine.NET改为WordPress至今都使用的阿里云香港云空间。稳定倒是挺稳定的,就是一直感觉访问速度比较慢,本以为是阿里云香港云空间本是这样,就没有研究其慢的真实原因,当然这已经是后话了。
今年云空间快要到期的时候,突然想将网站迁移到国内,为了不在备案期间停止域名访问,就更换了域名。当域名更换完成,空间迁移完毕,貌似一切准备就绪,发现原来空间即将到期,留给301跳转的时间非常不足。本想使用阿里云DNS解析进行301跳转,这个也是最优的解决方案,无奈的是域名必须进行备案且是两个域名都必须备案。如果原来的域名也参与备案的话,网站就需要停止访问了,为了避免这种情况,只能放弃使用此方法。
发现
续费原来空间或者购买腾讯云和百度云等在价格上是不划算的。...
1年前 (2023-08-30) 1015℃ 0评论
0喜欢
背景
一些朋友推荐处理Word可以使用Syncfusion.DocIO,说是API比较好用而且还支持doc格式的文件,因此就了解一下。经过测试确认是比一些开源的处理库好用一点,支持相对来说比较完善,就因为这些所以才会有这篇介绍的内容。
Syncfusion.DocIO.Net.Core
Syncfusion.DocIO.Net.Core是Syncfusion的一组.NET组件,用于创建、编辑和转换Microsoft Word文档。它支持多种文件格式,包括.docx、.rtf、.txt等。它提供了一组易于使用的 API,可以帮助开发人员轻松地创建、读取和修改 Word 文档。
主要功能
创建Word文档并添加内容、表格、图片等元素。
编辑Word文档中的文本、表格、图片等内容。
将Word文档转换为其他格式,如PDF、HTML等。
支持批量...
2年前 (2023-05-16) 1447℃ 0评论
3喜欢
背景
有一个客户需要对以前老项目部分功能进行升级,需要升级页面按照最新版本的内容进行更新,测试发现页面无法加载。F12使用开发者工具发现所有资源文件异常,所有的资源文件竟然自动将HTTP协议换成 HTTPS 协议。异常信息如下图所示:
项目目前部署是非HTTPS的,很奇怪为什么会自动转换为HTTPS资源。经过排查在异常页面中发现了问题,在head节点下发现以下代码
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
以上内容会将HTTP协议自动转换为HTTPS协议。
Content-Security-Policy
Content-Security-Policy(CSP)允许站点管理者控制用户代理能够为指定的页面加载哪些资源。除了少...
2年前 (2022-10-25) 1291℃ 0评论
13喜欢
背景
自己的一个小应用使用了ABP框架最新内容创建了一个项目模板,为了快速的完成第一版就是用来ABP自带的UI框架。在测试项目模板正常与否的时候发现关于UI方面的异常信息,第一次使用ABP官方提供的UI框架,所以先在此做一下记录。
以下是异常信息:
AbpException: Could not find the bundle file ‘/libs/abp/core/abp.css’ for the bundle ‘LeptonXLite.Global’!
解决方法
安装 abp cli命令行工具,地址 https://docs.abp.io/zh-Hans/abp/latest/CLI执行 abp install-libs,会自动把本项目最小依赖安装包自动安装到 /wwwroot...
2年前 (2022-10-05) 891℃ 0评论
14喜欢
背景
因为朋友想做一个软件认证相关的东西,所以考虑到关于电脑唯一标识机器码的问题。关于机器码之前并没有真正实现过,也只是了解大概的原理。今天就做一下简单记录,以便以后使用。
机器码
机器码指的是软件根据计算机的硬件信息,例如:CPU、内存、主板序列号等,按照一定的算法生成的一串无规律的字符串,并且在不同计算机上生成的机器码是不一样的,因为每台计算机的硬件信息不一样。机器码,也叫序列号、认证码、注册申请码等。
代码实现
using System.Management;
using System.Runtime.InteropServices;
namespace HonourWorld.Core.Common
{
public sealed class MachineCode
{
private read...
2年前 (2022-10-04) 2321℃ 0评论
4喜欢
背景
任何事情都有一个原由,本篇内容也不例外。如标题所示,关于判断登录的QQ是否已经加入指定的QQ群的问题。为什么是之二?因为之前已经写过一次相关内容了。既然曾经已经写过一次为什么还要写第二次?因为今天早上收到了一个邮件通知,这个是博客评论通知,有人评论就以邮件形式告知。评论内容是这样的:c#那个QQ群验证已经无法使用了能更新下吗。如下图所示:
没有错,就如我回复的一样,示例程序的代码的确不可以用了,不过思路依然可以使用。
分析
其实没有什么好分析的,思路与上次一样。只是上次验证的地址(http://qun.qzone.qq.com)无效了,可能是下线了吧!不过QQ也有关于群里管理的网站(https://qun.qq.com/),这个网站依然可以实现这样的操作。实现比较简单,访问网址https://qun.qq.com/member.html并登录,然后通...
2年前 (2022-09-25) 3080℃ 6评论
9喜欢
背景
因业务需求,需要保存一些指定的字符串,但这些字符串可能相同。为了避免重复存储造成数据大量冗余,所以需要对这些字符串进行一些散列计算。使这一些相同的字符串产生唯一的标识,实现业务上的需求。关于字符串散列算法还是比较多的,例如:MD2、MD4、MD5、Sha1、Sha256、Sha512等等,在结合字符串散列碰撞以及散列最终长度考虑,最后选中Sha1作为此次散列算法。
SHA-1
(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。
.NET CORE 实现 SHA1
以下是使用.Net Core自带类库...
2年前 (2022-09-24) 1715℃ 2评论
3喜欢
背景
引用了一个第三方的dll库,编译无任何异常提示,但是运行就报异常。自从有了Nuget基本没有再使用直接引用dll这种方式了。经过确认dll也设置了输出到目录,在 bin目录也的确存在此dll库。
异常信息
Could not load file or assembly ‘Aspose.Words, Version=20.6.0.0, Culture=neutral, PublicKeyToken=716fcc553a201e56’. 系统找不到指定的文件。System.IO.FileNotFoundException: Could not load file or assembly ‘Aspose.Words, Version=20.6.0.0, Culture=neutral, PublicKeyToken=716fcc553...
2年前 (2022-08-01) 1081℃ 0评论
4喜欢
背景
.net core 应用中使用了Excel文件导出,发现Excel导出失败,导出的操作出现了异常。看了一下是Gdip的这个异常。这个异曾经见到过,记得也很快解决了,不晓得为什么又会出现呢?仔细看了一下,详细错误还是有点差别。经过确认上一次安装的libc6-dev、libgdiplus是存在的,并没有丢失或者损坏。
根据异常信息,基本可以确定是引用System.Drawing.Common类库引起的问题,经过排查发现引用的Excel组件Magicodes.IE.Excel.Abp包中有使用System.Drawing.Common。前几天还好好的,现在为何System.Drawing.Common不支持非Windows平台呢?只是确定引用的System.Drawing.Common库的版本是6.0,其他的就没有太多线索。
最后又看一遍异常信息,根据异常提示打开所提示...
3年前 (2022-04-08) 1649℃ 0评论
28喜欢
有时候一些需求,移除字符串前后指定的字符串。其实,如果没有仅移除一次的需求,使用系统自带的方法即可完成,使用Trim、TrimEnd、TrimStart方法也比较快捷。当有一些特殊需求的时候,这些方法就不再方便。所以,就使用正则表达式简单的实现相关需求。
字符串扩展代码实现
public static partial class Extensions
{
/// <summary>
/// 移除字符串前后指定的字符串
/// </summary>
/// <param name="value">字符串本身</param>
/// <param name="trimContent">将要移除字符前后的指定内容</param>
//...
3年前 (2022-04-04) 1136℃ 0评论
1喜欢
背景
在.net 5应用中,使用了Excel文件处理,在Docker容器中运行就会出现关于libgdiplus的异常。虽然在Dockerfile中可以使用以下内容解决异常,但是这个速度太慢了。每次构建慢的让人怀疑人生,最重要的是还可能失败。
RUN apt-get update && apt-get install -y libgdiplus libc6-dev && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
为了提高构建速度,所以使用官方的基础镜像再二次构建一个基础镜像,默认安装 libgdiplus ,这样每次构建速度就会提升好多好多。默认安装了libgdiplus等库,以便支持Excel导入导出
构建基础镜像的Dockerfile
Dockerfile
...
3年前 (2021-12-18) 1605℃ 0评论
64喜欢
背景
在使用.net 5构建应用时,在处理某些编码问题使用了GB2312,应用运行后报错。经过确认知道了编码 GB2312 默认不支持。
异常信息
Not Support Encoding’GB2312′ is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method. (Parameter ‘name’)System.Exception: Not Support Encoding’GB2312′ is not a supported encoding name. For inf...
3年前 (2021-12-17) 1310℃ 0评论
3喜欢
一年前的一个项目,有人反馈上传超时,超时原因是文件大小超出限制。由于原来维护项目的人员离开,现在上传超时的问题就有我来处理。解决方案也比较简单,就是切片上传。前端不想自己写了,就利用了上传组件,这个上传组件是百度的WebUploader。WebUploader这个组件被使用的也比较广泛,为了省事就用它啦!
上传中
合并后
代码实现
前端代码
前端上传以及分片使用的百度上传组件WebUploader
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
...
4年前 (2020-12-31) 2463℃ 0评论
8喜欢
由于客户突然要进行国产化的一个要求,数据库使用更换了国产的达梦数据库,将数据由Oracle数据库迁移到达梦数据库。所以,之前基于Oracle处理的一些功能就需要进行一些调整。
使用NuGet 引入达梦数据提供器DmProvider
引用相关的组件后,就按照套路对已经存在的方法进行相关调整,结果出现了一些编译出错且无论如何调整都无法消除。如下:
错误 CS1705 标识为“Dm, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”的程序集“Dm”所使用的“System.Runtime, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”版本高于所引用的标识为“System.Runtime, Version=4.1.2.0, ...
4年前 (2020-12-07) 1388℃ 0评论
3喜欢
背景
因业务需求,需要与第三方进行融合登录。第三方融合登录接口有关于验签的要求,将解密的数据按照规定的顺序进行MD5进行签名验证并与提供的MD5签名作为对比。其加密的明文是Json字符串,解密后还原后要按照URl参数的形式进行排列进行MD5签名。
规定
加密参数(注:加密参数名称均为小写字母,没有使用驼峰法命名)
名称类型默认值简介sourceidString必传来源标识targetidString必传目标标识usercodeString必传用户唯一标识usernameString用户姓名idcardString身份证号码phoneString手机号码ounameString部门名称timeString必传当前时间戳,精确到毫秒
签名数据采用以上面表格顺序以及以下格式进行字段拼接
sourceid=skyfinder&targetid=sky&...
4年前 (2020-09-08) 930℃ 0评论
6喜欢
背景
因某些需求,需要与合作单位进行相应的数据交互,而交互均使用了加密方式处理并用MD5作为签名,以便校验传输内容是否遭到篡改。
MD5
md5是一种信息摘要算法,它可以从一个字符串或一个文件中按照一定的规则生成一个特殊的字符串,并且一个文件所对应的MD5摘要是固定的,当文件内容变化后,其MD5值也会不一样,因此,在应用中经常使用MD5值来验证一段数据有没有被篡改。
.NET CORE 实现MD5
以下简单实现,支持返回大小写、32位以及16位MD5字符串。
public static class EncryptionMd5
{
/// <summary>
/// md5加密
/// </summary>
/// <param name="conten...
4年前 (2020-09-02) 3011℃ 0评论
10喜欢
背景
因业务需求,需要与其他平台实现融合登录,根据提供融合登录方的文档内容,对AES加密解密相关内容使用.NET CORE来进行一次实现。以下记录实现AES加解密后的内容,便以后备用。
AES
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128、192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。包括AES-ECB、AES-C...
4年前 (2020-09-02) 2321℃ 0评论
1喜欢
使用asp .net core 2.1使用自带的依赖注入,自带的依赖注入是构造函数注入。有些情况,构造函数注入并不能满足需求,所以需要使用其他方法获取指定实例。
public interface IEngine
{
/// <summary>
/// 类型构建
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
object Resolve(Type type);
}
public class GetEngine: IEngine
{
private IServiceProvider _serviceProvider;
...
4年前 (2020-08-08) 2128℃ 2评论
8喜欢
有些时候会在博客中分享一些拍摄的照片,而这些拍摄照片的大小均在1.5M以上,随随便便分享点图片占用的存储空间就有点惊人。为了节省存储空间,避免尽早将剩余存储空间消耗完毕,所以就考虑压缩一下图片。这里来做下记录。
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
namespace ImageCompress
{
class Program
{
static void Main(string[] args)
{
string path = $"{Path.Combine(Directory.GetCurrentDirectory(), "image")}";
Compre...
5年前 (2020-04-03) 2715℃ 0评论
7喜欢
因某些原因,需要打开日志进行排查,本来是很简单的事情,当看到日之后就觉得力不从心。日志文件太大了,将近5G,自己电脑打不开这种大文件。一开始就想到了文件分割,然后就再网上找一些分割工具,找了几个分割工具杀毒软件都报毒。找工具也真是个麻烦的事情,找到半天没有见到一个合适的。其中一个不报毒(主动查杀了一次)的,双击后也打不开,这个时候我就怀疑自己中招(中毒)了,到底有没有中招暂时不太清楚,所以赶紧利用杀毒软件查杀病毒。在查杀病毒的期间自己就动手使用C#写一个简单的文本文件分割工具。这里就记录一下.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
namespace TxtFileCutAp...
5年前 (2020-04-03) 2035℃ 0评论
8喜欢
突然有一个需求,要求数组中数据在返回前进行随机打乱,于是就记录下来。
方法一
public static void ListRandom<T>(List<T> sources)
{
Random rd = new Random();
int index = 0;
T temp;
for (int i = 0; i < sources.Count; i++)
{
index = rd.Next(0, sources.Count - 1);
if (index != i)
{
...
5年前 (2020-03-31) 4238℃ 0评论
8喜欢
每年春节买票都成为相当重要的事情,快人一步基本能尽可能的抢占先机。使用抢票软件尽可能的减少手工操作,从而提高抢票的成功机率,由于时间误差也可会丧失先机,所以同步系统时间也是重要一步。为了可以自动的同步本地时间,所以就使用C#实现一个时间同步小工具。
只针对Windows系统的时间同步且使用抢票平台的不在此列。
using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace WindowsDateTimeSynchronization
{
public class Da...
5年前 (2020-02-08) 3604℃ 4评论
4喜欢
简介
缓存的工作机制是先从缓存中读取数据,如果没有,再从慢速设备上读取实际数据并同步到缓存。计算机系统里天然就存在多级缓存系统,这是由于不同的硬件设备的访问速度以及容量大小不一致引起的一个选择。比如,CPU到L1/L2/L3到内存到磁盘的访问方式就是一个典型的多级缓存的例子。当CPU需要数据的时候,它首先到L1里找,如果没有找到,则查找L2/L3,如果还是没有找到,则再到内存里找,如果还没有,再到磁盘里查找。不同层级的缓存的访问速度和容量大小各不相同,简要对比如下所示:
名称
访问速度
通常容量大小
L1
1.3纳秒
12组每组32KB数据加32KB代码
L2
3.92纳秒
32组每组256KB
L3
11.11纳秒
30MB
DDR4 内存
...
5年前 (2020-01-16) 1033℃ 0评论
0喜欢
由于项目中需要实时消息,所以就使用了ASP.NET(Core) SignalR实时通讯库。因为业务服务与通讯服务是独立的,所以涉及到跨域的问题, 浏览器抛出的异常非常明显,这个是明显跨域相关内容。 报错信息如下:
Access to XMLHttpRequest at ‘http://192.168.2.13:5005/api/v1/commommessage/messageHub/negotiate’ from origin ‘http://127.0.0.1:5500’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control...
5年前 (2020-01-13) 3355℃ 0评论
30喜欢