分类: 心得体会

  • 解决 Arm 系统中 IIS 错误 500.19 的问题

    自从更换了苹果 mac book pro 的 m1 芯片的笔记本作为开发电脑以后,遇到了很多奇怪的问题。比如,IIS 就无法正常的启动,甚至应用程序池都会无故的崩溃,无奈我更换了 win11 22H2 的 ARM 版本镜像,安装的时候选择 win11 专业版。如果你不是这个版本,可能操作的步骤会和我的不一样。

    首先,我用的是 win11 22H2 的 ARM 版本镜像,安装的是 win11 专业版系统,安装的时候,先安装了.net 环境,然后,再去 windows 功能中,安装了 iis 服务器。此时,我准备部署以前的一个 mvc 的程序,突然发现出现了 IIS10.0 HTTP 错误 500.19,如下:

    解决方法:
    %windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers
    %windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules

    相信很多人,网上查询后,也差不多是这个结果,但是,实际上,你执行了这两句命令后,问题还是不能得到解决。

    会出现下面的这种错误情况:

    HTTP 错误 500.21 - Internal Server Error
    处理程序 「ExtensionlessUrlHandler-Integrated-4.0」 在其模块列表中有一个错误模块 「ManagedPipelineHandler」
    最可能的原因:
    使用了托管处理程序,但是未安装或未完整安装 ASP.NET。
    处理程序模块列表的配置中存在书写错误。
    在应用程序初始化期间,要么应用程序初始化功能已将 skipManagedModules 设置为 True,要么重写规则设置了映射到托管处理程序的 URL 并且还设置了 SKIP_MANAGED_MODULES=1

    解决方法:
    执行命令

    dism /online /enable-feature /featurename:IIS-ISAPIFilter
    dism /online /enable-feature /featurename:IIS-ISAPIExtensions
    dism /online /enable-feature /featurename:IIS-NetFxExtensibility45
    dism /online /enable-feature /featurename:IIS-ASPNET45

    做完以上的操作,一般来说,有些朋友能够解决问题,但是,对于我的 win11 专业版来说,因为是 arm 版本,另外 iis 又是新装的,所以,直接给我又出现了如下的错误:
    当前标识 (IIS APPPOOL\XXXX) 没有对 「C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files」 的写访问权限。
    解决方法:
    打开 powershell 或者 cmd,用管理员身份运行以下命令
    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Aspnet_regiis.exe -ga 'IIS APPPOOL\XXXX'
    另外, 对 windows 文件夹中的 temp 文件夹进行权限设置

    就在我以为能够成功的时候,再次运行刷新,又给我提示如下错误:
    当前标识 (NT AUTHORITY\SYSTEM) 没有对 「C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files」 的写访问权限。
    于是,我翻阅网上资料,都是千篇一律的抄袭文章,都让执行命令:C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis -i -enable 但是,实际上没有任何用处。
    于是我想是不是压根就没有这个文件夹路径,直接对文件夹进行权限设置。
    果然,我发现没有这个文件夹,果断新建了,同时,赋予了 everyone 的权限,全部可写,完全控制,毕竟本机开发也不用限制那么严格。
    如下:

    就当我以为能够完成成功了,正常刷新出网页了,但是,又给我提示了如下错误:
    未能加载文件或程序集 「xxx.ooo.WebApiService」 或它的某一个依赖项。试图加载格式不正确的程序。
    那这个问题还是比较好解决的,因为我老项目源码中,引用了 x86 核心的东西,而我当前 iis 应用程序池是 arm 的。
    解决方法:

    最终,我之前的老项目的成功启动

    这些都是我个人一步步处理研究的心得,希望能够帮助有缘人,另外,我很厌恶网上千篇一律抄袭的文章。

  • 解决 wp 升级 6.4 版本后,评论出现 discussionURL 的问题

    很久很久没有写文章了,因为自己实在抽不出空,同时,也没有灵感,要写就要写一些实际的,技术性的文章。这次,更新了 wp 系统到最新版本后,出现了诸多怪异问题,比如,谷歌字体镜像出现问题,网页打开缓慢,不过,还好插件更新了,更换了新的地址。其次就是,遇到了最让我烦躁的文章评论区,一直显示 discussionURL 的这个问题。我本来以为是自定义主题的问题,后面查询分析后,发现是 wp 自身函数的问题。在中文网上是找不到具体解决方案,外网论坛,有一个方案是:进入主题外观-自定义,然后在自定义器中,转到 「发布信息」,元信息,并取消选中显示评论的框。禁用该选项将使 itemprop=「discussionURL」 文本消失,但它也会删除每个帖子上评论的数量。如果你能忍受失去那个数字,你可以摆脱现在显示的文本。但是,这个明显不是我要的答案,所以,在我努力下,我在外网上找到了另外一个可行的方案。

    具体如下:

    打开主题文件夹中的 includes/comments.php 这个文件,找到如下代码:

    cryout_schema_microdata(『comment-meta』);

    改为:

    cryout_schema_microdata(『comment-meta』, 0);

    这样,既能去除烦人的 itemprop=「discussionURL」 文本,也能正常显示评论的数量。

    最后,希望有缘人能够看到我这篇文章,能解决喜欢 wp 程序的朋友们。当然,如果您是高手,能过自行解决,那是再好不过的了。

  • 如何快速清除 Visual Studio 程序中源码空行及删除空行

    日常编写代码中, 会遇到一些代码格式化的问题, 为了让代码能够看起来规范一点, 那么, 需要使用 vs 自带的格式化的命令, 比如, 可以 Ctrl+K+D(三个键同时按下), 也可以 Ctrl+K 再 Ctrl+D, 或者全选代码后,Ctrl+K 和 Ctrl+F.

    但是, 有时候由于代码排版问题, 会存在一些空行, 这时候, 格式化命令可能就不好使了, 此时, 需要用到 ctrl+H 进行批量替换, 由于换行符是特殊字符, 所以, 需要使用正则表达式进行搜索, 然后, 进行统一的替换, 输入:^(?([^\r\n])\s)*\r?$\r?\n 进行批量替换即可.

    替换空行

    希望这些小技巧, 能够帮助到看到这篇文章的有缘人.^-^

  • Webbrowser 控件设置 IE11 加载页面方法

    不知道大家有没有出现过这种情况, 我 IE 浏览器明明就是 IE11, 为什么使用 webbrowser 控件加载网页, 依然提示浏览器版本过低. 这个是因为,webbrowser 默认采用 IE8/IE9 模式去加载, 会导致页面出现各种错乱. 这次, 因为国拍网拍牌系统更新, 使用了最新的 H5, 所以, 我必须要想办法, 让 IE 浏览器, 使用 IE11 模式去加载. 具体方法如下:

    运行 Regedit,打开注册表,找到:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

    然后, 根据图片中, 更改默认 IE 浏览器 exe 的 dword 值

    IE 各版本的值如下:

    • 11001 (0x2EDF) Internet Explorer 11. Webpages are displayed in IE11 Standards mode, regardless of the !DOCTYPE directive
    • 11000 (0x2AF8) :Internet Explorer 11. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode
    • 10000 (0x2710) :Internet Explorer 10. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode.
    • 10001 (0x2AF7) :Internet Explorer 10. Webpages are displayed in IE10 Standards mode, regardless of the !DOCTYPE directive.
    • 9999 (0x270F) :Internet Explorer 9. Webpages are displayed in IE9 Standards mode, regardless of the !DOCTYPE directive.
    • 9000 (0x2328) :Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode.
    • 8888 (0x22B8) :Webpages are displayed in IE8 Standards mode, regardless of the !DOCTYPE directive.
    • 8000 (0x1F40) :Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode.
    • 7000 (0x1B58) :Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode.

  • 浅谈 ImageList 中索引超出问题

    最近在进行代码合并的过程中, 遇到了 ImageList 控件运行到 SetKeyName 方法时, 提示 IndexOutOfRangeException 的情况. 也即是索引超出的异常. 分析设计器中图片数量, 以及断点调试, 发现设计界面中图片数量为 9, 实际运行时读取到的图片数量为 6, 导致, 后续 SetKeyName 的时候, 出现了超索引的问题.

    解决思路:

    • 修复对应的 form 窗体的 resx 的资源文件
    • 排查是否改过 form 窗体多语言属性, 注意类似 en.resx,zh.resx 这些多语言的资源文件.

    根本原因:

    ImageList 会从 resx 资源文件中读取图片二进制的 base64 字串内容, 但是, 如果你设置了窗体的多语言, 也即是窗体的 language 属性, 那么, 也要对应的修改 zh.resx,en.resx 这些资源文件. 因为, 设计器界面默认只修改缺省的 resx 文件, 但是, 运行程序的时候, 会去读取对应的语言的 resx 资源文件. 所以, 删掉这些资源文件, 那么 ImageList 就会只从缺省的 Resx 文件中读取了.

    总结:

    写下这篇文章, 主要是网上能够查到的一些解决方案, 大多都没有说明其本质, 不能解决问题. 希望我的这篇文章能够解决和我遇到这个相同问题的朋友.

  • 冒泡排序的实现

    冒泡排序的实现

    自己做个笔记,这种基础算法,好多公司的面试题里面都会有。
    具体如下:

    int tempNum = 0;
    int[] arr = {12, 33, 12, 2, 5, 22, 333, 888, 111};
    for (int i = 0; i < arr.Length - 1; i++) 
    {
    	for (int j = 0; j < arr.Length - 1 - i; j++) 
    	{
    		if (arr[j] > arr[j + 1]) 
    		{
    			tempNum = arr[j + 1];
    			arr[j + 1] = arr[j];
    			arr[j] = tempNum;
    		}
    	}
    }

  • 给ToolStrip工具栏扩展一个CheckBox单选框类型按钮的方法

    给 ToolStrip 工具栏扩展一个 CheckBox 单选框类型按钮的方法

    进行过 winform 开发的朋友,对 toolStrip 的工具栏肯定不陌生,但是,非常遗憾。toolStrip 不自带 CheckBox 类型的菜单。
    效果如下图:

    本篇文章将指导如何完成这个扩展工具栏项目类的写法。直接上代码,如下:
    首先,定义一个类名,叫 ToolStripCheckBox,继承基类 ToolStripItem

    public partial class ToolStripCheckBox : ToolStripItem

    然后,在类上面加上特写类写法,如下:

    [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip)]
    

    添加后,就能正常的在设计时界面中,看到自己新增的特殊扩展类的按钮了。

    接着,有三件事要做,首先,我们需要绘制一个单选框按钮,那么,需要重写绘制事件,具体代码如下:

    protected override void OnPaint(PaintEventArgs e) 
    {
    	if (base.Owner != null) 
    	{
    		Point pLocation = new Point(e.ClipRectangle.X,e.ClipRectangle.Height / 2 - (13 / 2));
    		Size txtSize = TextRenderer.MeasureText(this.Text, this.Font);
    		Rectangle rectText = new Rectangle(pLocation.X + 13, pLocation.Y, txtSize.Width, txtSize.Height);
    		CheckBoxState chkState = IsChecked ? CheckBoxState.CheckedNormal : CheckBoxState.UncheckedNormal;
    		CheckBoxRenderer.DrawCheckBox(e.Graphics, pLocation, rectText, this.Text, this.Font, false, chkState);
    	}
    }

    还要重写宽度与高度,以便适应大小,否则重绘后会出现文字超出边缘的情况,具体代码如下:

    public override Size GetPreferredSize(Size constrainingSize) 
    {
    	base.GetPreferredSize(constrainingSize);
    	Size preferredSize = base.GetPreferredSize(constrainingSize);
    	preferredSize.Width += 13;
    	return preferredSize;
    }

    那么,为了达到能够点击切换选中的效果,那么,必须要重写单击事件,并且定义一个选中属性,具体代码如下:

    public bool HasChecked
    {
        get
        {
            return IsChecked;
        }
        set
        {
            IsChecked = value;
            this.Invalidate();
        }
    }
    protected override void OnClick(EventArgs e)
    {
        IsChecked = !IsChecked;
        base.OnClick(e);
    }

    基本上根据以上方法,就在工具栏上能扩展出一个单选框按钮,当然了,这个只是一个尝试,实际应用控件的话,你要考虑的更多!

    示例下载:

  • ApexSql Log 简单使用教程

    ApexSql Log 简单使用教程

    ApexSql Log 这款工具估计大部分人比较陌生,因为,如果不是专业 DBA 或者开发者,基本用不到这款工具。但是,不得不说这款工具确实是非常强悍,能够让已经被你 delete 掉的数据再找回来。
    不过,这款工具网上也没有具体使用教程,估计用的人也不是很多,属于冷门工具吧。那么,今天我就简单写一下这款软件大致的使用方法,以及一些步骤的界面。

    首先,打开程序后,会让你选择数据库,这个数据库就是被你删掉数据所在的数据库。如下:

    我这边直接选择 master 数据库作为演示。
    第二步,就是让你选择数据库对应的日志文件,因为,恢复数据还是要通过日志文件来进行。如下:

    第三步,选择一种输出方式,有很多选项,我们选择第一个将结果返回一个 grid 中进行操作。如下:

    最后,就是选择一个时间范围,你需要回想一下,你的数据,大概是什么时间段被不小心删除的。如下:

    大致上,这块软件就是这样操作,当你选择后,会自动从数据库日志文件中读取到这个时间段的具体操作,有 Update,有 delete 等等,根据自己的回忆,定位到具体的数据与语句,最后,执行一个 undo 操作,即可生成恢复数据的 sql 数据,直接执行即可恢复。这边就不在详细描述与截图。不过,需要注意的是,你的数据库的日志文件,必须要完整,如果你数据库是备份恢复后的,那么,需要保证必须要完整备份的那种才能正常进行恢复工作。希望这篇简单的教程能够帮助到那些由于误操作引起 SQL 数据丢失的朋友。具体文中的工具,大家也可以在本站 Fkzone 中找到。当然,这款工具还是收费工具,试用 14 天有效期。

  • Net4.5 智能提醒汉化异常问题

    安装完毕 VS2015 后,自动安装了 net framework 4.5 及 对应的语言包。但是,安装了其他 vs 版本后,或者安装了高版本的 net framwork 后,会导致智能提醒中的类说明,以及方法说明变成英文。可能是一个 Bug,所以,本文提供对应的原版汉化后的 xml 文件进行替换。


    下载:
    zh-Hans.zip

  • Webbrowser 强制当前窗口打开链接方法

    这个功能解决的方法,网上一搜比比皆是,方法大多都一样,我的方法也不例外,这次再写,也是因为我之前博客也写过此文章,这次就当作记录一次心得。
    在 webbrowser 的 NewWindow 事件中,增加如下代码:

    string sUrl = ((WebBrowser)sender).StatusText;
    ((WebBrowser)sender).Navigate(sUrl);
    e.Cancel = true;