Windows安装自己开发的.NET Windows服务全攻略

在日常开发中,我们经常会遇到需要将.NET应用程序注册为Windows服务的场景。本文将手把手教你如何通过InstallUtil工具完成服务的安装与卸载,并附赠避坑指南。(搓手期待脸)

一、准备工作

在开始操作前,请确认以下三点:

  1. 已安装对应版本的.NET Framework(示例使用v4.0.30319)
  2. 服务程序myservice.exe已生成且经过测试
  3. 建议将服务文件存放在非系统目录(如D:\MyServices\)

💡小贴士:右键点击解决方案生成时,记得选”Release”模式哦~

二、详细安装步骤

第一步:启动管理员命令行

按住Win + X键,在弹出菜单中选择【Windows Terminal(管理员)】,就像开启魔法权限一样~

第二步:执行安装咒语

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe C:\Windows\service\myservice.exe

当看到这两句魔法生效提示时,说明安装成功啦:

正在提交安装阶段...

安装已成功完成。

三、验证服务安装

方法1:可视化检查

按下Win + R输入services.msc,在服务列表里找找你的服务名称,就像在人群中找老朋友一样~

方法2:命令行确认

sc query myservice

看到STATE显示为STOPPED就说明服务已经在乖乖待命啦!


四、卸载服务指南

当需要更新服务时,先来段优雅的卸载舞蹈:

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u C:\Windows\service\myservice.exe

成功时会收到这样的友好通知:

正在开始卸载的安装阶段...
卸载已成功完成。

五、避坑宝典

  1. ​权限不足:看到”拒绝访问”提示?请检查是否以管理员身份运行CMD
  2. ​路径陷阱:若出现”找不到文件”,请检查路径中的空格是否用双引号包裹
  3. ​依赖缺失:安装失败时记得检查是否缺少.dll文件
  4. ​版本迷思:使用.NET Core开发的服务请改用sc create命令

六、知识扩展

对于使用新版本.NET的同学,可以试试这个现代咒语:

sc create "myservice" binPath="D:\Services\myservice.exe"

希望这篇指南能像贴心助手一样,帮你顺利完成服务部署。如果在实践中遇到任何魔法失灵的情况,欢迎在评论区召唤技术支持哦!(ง •̀_•́)ง

IIS配置MP4格式MIME类型终极指南

一、血泪故事会:为什么你的视频播不了?

昨天隔壁工位老王的旅游网站突然被客户投诉,所有风光展示视频都变成「白屏黑洞」。最后发现是IIS把.mp4文件当成二进制流推给浏览器,导致视频无法解析。今天我们就用5分钟根治这个顽疾!(╯‵□′)╯︵┻━┻


二、MIME类型急救知识包

1. 什么是MIME类型?

就像文件身份证,告诉浏览器「我是谁,该怎么打开」。当IIS遇到不认识的文件类型时,会默认使用application/octet-stream(二进制流),这就是视频无法播放的元凶!

2. MP4的正确打开方式

  • ​正确姿势:video/mp4(推荐!浏览器自动调用播放器)
  • ​备胎方案:application/mp4(部分老系统兼容)
  • ​错误示范:application/octet-stream(默认导致播放失败的罪魁祸首)

📌 行业冷知识:根据RFC 4337标准,MP4官方MIME类型是video/mp4


三、图形界面配置四步曲(附灵魂图解)

步骤1:召唤IIS管理器

Win + R 输入inetmgr,就像打开阿拉丁神灯一样~

步骤2:定位MIME设置

步骤3:添加新条目

点击右侧【添加】按钮,填写魔法参数:

文件扩展名: .mp4
MIME类型: video/mp4

步骤4:重启大法好

操作完成后一定要右键选择【重新启动】站点,就像给服务器做心肺复苏!


四、命令行高手模式(批量部署必备)

# 添加MP4类型
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/staticContent" -name "." -value @{fileExtension='.mp4';mimeType='video/mp4'}

# 立即生效咒语
iisreset /noforce

五、疑难杂症急诊室

症状1:配置后仍然无法播放

  • 检查清单:
    • 清除浏览器缓存(Ctrl + Shift + Del)
    • 检查文件权限(右键文件→属性→安全)
    • 查看HTTP响应头(F12开发者工具)

症状2:服务器报404错误

<!-- 在web.config中加入 -->
<system.webServer>
  <staticContent>
    <remove fileExtension=".mp4" />
    <mimeMap fileExtension=".mp4" mimeType="video/mp4" />
  </staticContent>
</system.webServer>

六、安全加固小课堂

危险操作预警!

⚠️ 不要图省事添加<mimeMap fileExtension=".*" ... />,这相当于给黑客开后门!

推荐白名单策略

<staticContent>
  <mimeMap fileExtension=".mp4" mimeType="video/mp4" />
  <mimeMap fileExtension=".webm" mimeType="video/webm" />
  <!-- 显式声明允许的视频格式 -->
</staticContent>

七、跨版本兼容指南

IIS版本特殊说明
IIS 7.x需要安装静态内容模块
IIS 8+原生支持H.264编码
IIS 10支持HTTP/2视频流

🎯 实战演练:访问你的视频地址,用https://tools.keycdn.com/curl检查MIME类型是否显示为video/mp4,看到绿色的正确标识就可以开香槟啦!🍾

如果还有任何悬案未破,欢迎在评论区召唤技术支援小队! (•̀ᴗ•́)و ̑̑

jquery easyui datagrid 全选、反选、清除

//全选
function allselectRow(tableName) {
    $('#' + tableName).datagrid('selectAll');
}
//反选
function unselectRow(tableName) {
    var s_rows = $.map($('#' + tableName).datagrid('getSelections'),
            function(n) {
                return $('#' + tableName).datagrid('getRowIndex', n);
            });
    $('#' + tableName).datagrid('selectAll');
    $.each(s_rows, function(i, n) {
        $('#' + tableName).datagrid('unselectRow', n);
    });
}
//全清
function clearSelections(tableName) {
    $('#' + tableName).datagrid('clearSelections');
}
var grid = $('#tt1');
        var options = grid.datagrid('getPager').data("pagination").options;
        //当前页数
        var currentPage = options.pageNumber;
        //总条数
        var total = options.total;
        //当前页记录数
        var rows = options.pageSize;
        //总页数
        var max = Math.ceil(total / options.pageSize);


//全选选择
function checkAll() {
    $("input[name='menuid']").each(function() {
        $(this).attr("checked", true);
    });
};
//反向选择
function reversal() {
    $("input[name='menuid']").each(function() {
        $(this).attr("checked", !this.checked);
    });
}
//取消选择
function clearCheck() {
    $("input[name='menuid']").each(function() {
        $(this).attr("checked", false);
    });