通过WebSocket隧道,尝试将ASP.NET网站空间当作VPS来使用
作者:V君 发布于:2021-1-17 11:50 Sunday 分类:折腾手记
先上 PoC源代码 再开始扯,这次不是着重解决某个问题,而是尝试确定某种可能性。
以前使用过 C9.io 提供的免费在线开发环境来搞各种事情,包括正常上网,无非是利用 Web Sockets 建立隧道,然后配合客户端连接到在上面运行各种应用程序。
现在C9已经被收购且停止免费了,那就公开来说吧w
这次也不例外,只不过花了点钱搞了个支持 ASP.NET 4.5+ 的网站空间,然后在上面搞类似的事情。
基础设施 -- WebSocket 转 TCP 模块
首先要使用 WebSocket 来建立一条隧道,要求网站空间支持且启用 WebSocket,不然没法整。这里有个未经优化,但还能凑合着用的例子,只要挂在 HttpModule 中 HttpApplication 的 PostMapRequestHandler 事件,填好参数就能吃。
折腾1 -- SSH 终端
略去寻找绿色 SSH 服务端的辛酸过程,时间直接转到发现 FxSsh 这个纯托管实现的服务端。这里要分成两个部分来扯,分别是使用基于 ConPTY 的 MiniTerm 和兼容低版本 Windows 的简单兼容实现。由于 FxSsh 主要实现的是 SSH 协议通道,服务端的终端并没有适配,尽管源代码中带了个名为 MiniTerm 的 DEMO 来适配到较新系统的 ConPTY。
第一部分:基于 MiniTerm 的实现。原版的 MiniTerm 虽然导入了 ResizePseudoConsole 这个 API 但并没有使用。而且由于 NuGet 上的 FxSsh 不是最新版,没有窗口大小变更事件的支持。 因此我把他们全都拷贝到自己的项目中并注明来源了。在此之上再加以修改 MiniTerm 使窗口大小变更事件适配到 MiniTerm 的实现。目前并没有发现太多问题。有点小遗憾的是 MiniTerm 使用的 ConPTY 功能是 Windows 10 近些年的更新才引入的,因此许多网站空间的系统都不支持,会报「在 kernel32 中找不到 CreatePseudoConsole 入口」的错误,因此我准备了另一个方案,见接下来的第二部分。
第二部分:另行实现一个兼容低版本 Windows 的控制台进程适配。在项目中起名为 EasyTerminal。起初简单将控制台进程的标准输入输出还有错误输出重定向到 SSH 通道,然鹅,回车键不起作用,而且不回显。将回车键拦截下来,改成 StandardInput.WriteLine 调用,总算是能满足最基本的需求。尽管还是没有实时回显,得按下回车键之后才显示出来,功能按键和窗口大小什么的更无从说起。目前仍在使用零碎的时间持续摸索(咕XD)…
折腾2 -- 正常上网 将网站空间当作 V2 服务端使用
编译部署这个项目,然后将 V2 的两个 exe 和配置文件丢进 App_Data 目录,然后使用 WS 隧道连接到监听的 URL,最后在 V2 客户端指向 WS 隧道客户端,这时候就能吃了。分配了较大的缓冲区大小,这应该能有效减少损耗,如果网速慢,你需要测一下空间到你的网速。
不水。
标签: 软件开发 个人服务器 C# HTTP Web技术 传输协议 Windows .NET IIS WebSocket
搭建自己的NuGet托管服务器,并通过符号源服务器提供带源码的调试体验
作者:V君 发布于:2018-9-19 19:43 Wednesday 分类:挖坑经验
尽管花了不少时间但都是些坑或者自己没注意,这次不想扯,直接TLDR:
使用命令行把项目打包并推送到服务器 (参考官方文档)
1) 下载最新版NuGet.exe,
2) 为项目编写nuspec文件,可以通过spec参数创建一个模板
3) 分别使用pack命令打包库或pack -symbol也生成符号包
4) 使用push命令将这俩分别推送到对应服务器
+) 如果想连同PDB文件一起打包(可以堆栈跟踪里获得源代码位置),可以添加下配置到nuspec根
<files>
<file src="bin\$configuration$\$id$.pdb" target="lib\netxxx\" />
</files>
这样做有个副作用会让符号包生成时产生警告PDB文件重复
还有一个副作用会让符号源失效,在DLL旁边PDB似乎挡住了前往符号源服务器的去路,
导致F11进不去,你得在启动调试之前自己把输出目录的PDB删除
目前的做法是写成生成事件,仅匹配Debug生成时删除指定的PDB文件
搭建NuGet服务器 (参考自官方文档)
1) 新建空白Web项目,引入NuGet包[NuGet.Server]
2) 修改web.config配置ApiKey或干脆禁用验证
3) 部署到服务器
搭建符号服务器 (参考X.D.的博客文章)
1) 创建空白MVC项目,引入NuGet包[SymbolSource.Server.Basic]
2) 在服务器上安装Windows Kits Debuggers,下载SDK安装器进行可选安装
3) 部署到服务器,配置好web.config指向上者安装路径的srcsrv
4) 如果用了主机头绑定和HOSTS,在服务器也需要配置指向自己的HOSTS
x) 这货好像也能当NuGet包托管服务器?(但貌似不能设置ApiKey验证
在VS使用自己部署的NuGet包服务器
1) 在菜单工具-选项打开选项对话框
2) 在左边选择NuGet包管理器-程序包源,添加服务器地址到列表,确定
3) 在包管理器检索时不要忘记切换到自己的服务器,或简单选择全部
在VS使用调试符号 (参考符号源官网文档)
1) 在菜单工具-选项打开选项对话框
2) 在左边选择调试-符号,添加服务器地址到列表
3) 接着在左边找到兄弟节点常规对里面的选项做一些改动,见参考文档
4) 在调试时对着提供了符号包的NuGet程序集调用按下F11, VS会自动找到源代码并进入调试
扩充话题
在程序集里嵌入Git提交哈希,可以使用[MSbuildGitHash]这个包来轻松完成
但这货有个缺点,如果机器上没安装Git或者当前项目不是Git托管,就会编译失败
需要自己指定MSBuild条件来绕过.
VCommon.Ioc:依赖注入与调用拦截
作者:V君 发布于:2018-8-5 19:41 Sunday 分类:VCommon
此程序集作为通用应用程序基础类库(VCommon)的一部分.
使用Unity容器实现基于接口的可拦截自动注册.
VCommon:基础程序集
作者:V君 发布于:2018-8-5 18:49 Sunday 分类:VCommon
此程序集作为通用应用程序基础类库(VCommon)的基础, 类库中其他程序集均引用本程序集.
提供了许多可用于偷懒的捷径扩展方法以及对.NET Framework做扩充, 不依赖第三方库.
VCommon:总体介绍
作者:V君 发布于:2018-8-5 16:15 Sunday 分类:VCommon
近年来一直在不断整理的,用在工作项目和业余项目的通用应用程序基础类库.
碰巧公司首字母和昵称首字母相同, 就起了VCommon这个名.
用汽车来打比方, .NET只是发动机(执行引擎), 要让车子能够开动起来还需要:
车架 (架构)
传动机构 (业务逻辑)
油箱,管线和轮子 (IO)
方向盘和操纵杆以及各种开关 (UI)
为了不那么丑还需要一个具有样式的外壳 (UX)
这就是整理出一个类库的理由,把共通的部分抽出来,为上述的各个部件提供基础实现,
无论你是自行车还是小汽车,火车甚至是风车都没关系.任意应用程序类型均适用.
使用的时候按需拼到一块儿就能省去大量的重复工作.
blogger
Google Web Translator
热门日志
随机日志
最新日志
最新评论
- V君
@Quartz:(出现)... - Quartz
怎么不见人了呢... - V君
@Soar:DHCP 协议相... - V君
@Soar:当然是非... - Soar
@V君:谢谢 有空... - Soar
搞一个 1230v3+B85... - V君
@Soar:另外,也可... - V君
@Soar:iscsi服务端... - Soar
难怪这么卡,尤其... - Soar
clone了源码,提示...
分类
存档
- 2024年5月(1)
- 2023年7月(1)
- 2023年5月(1)
- 2022年11月(1)
- 2022年10月(1)
- 2022年9月(1)
- 2022年8月(1)
- 2022年7月(1)
- 2022年6月(1)
- 2022年5月(2)
- 2022年4月(1)
- 2022年3月(1)
- 2022年2月(1)
- 2022年1月(1)
- 2021年12月(1)
- 2021年11月(1)
- 2021年10月(1)
- 2021年9月(1)
- 2021年8月(1)
- 2021年7月(1)
- 2021年6月(1)
- 2021年5月(1)
- 2021年4月(1)
- 2021年3月(1)
- 2021年2月(1)
- 2021年1月(1)
- 2020年12月(1)
- 2020年11月(1)
- 2020年10月(2)
- 2020年9月(1)
- 2020年8月(1)
- 2020年7月(1)
- 2020年6月(1)
- 2020年5月(1)
- 2020年4月(2)
- 2020年3月(3)
- 2020年2月(1)
- 2020年1月(1)
- 2019年12月(1)
- 2019年11月(1)
- 2019年10月(1)
- 2019年9月(1)
- 2019年8月(2)
- 2019年7月(1)
- 2019年6月(1)
- 2019年5月(1)
- 2019年4月(1)
- 2019年3月(1)
- 2019年2月(1)
- 2019年1月(2)
- 2018年12月(2)
- 2018年11月(1)
- 2018年10月(3)
- 2018年9月(4)
- 2018年8月(6)
- 2018年7月(4)
- 2018年6月(1)
- 2018年5月(2)
- 2018年4月(2)
- 2018年3月(3)
- 2018年2月(1)
- 2018年1月(1)
- 2017年12月(1)
- 2017年10月(2)
- 2017年9月(1)
- 2017年8月(2)
- 2017年7月(1)
- 2017年6月(5)
- 2017年5月(2)
- 2017年4月(2)
- 2017年3月(3)
- 2017年2月(2)
- 2017年1月(2)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(3)
- 2016年9月(4)
- 2016年8月(2)
- 2016年7月(4)
- 2016年6月(3)
- 2016年5月(1)
- 2016年4月(4)
- 2016年3月(3)
- 2016年2月(1)
- 2016年1月(5)
- 2015年12月(4)
- 2015年11月(5)
- 2015年10月(1)
- 2015年9月(6)
- 2015年8月(4)
- 2015年7月(1)
- 2015年6月(6)
- 2015年5月(3)
- 2015年4月(3)
- 2015年3月(2)
- 2015年2月(1)
- 2015年1月(3)
- 2014年12月(1)
- 2014年11月(1)
- 2014年10月(1)
- 2014年9月(3)
- 2014年8月(1)
- 2014年7月(1)
- 2014年6月(1)
- 2014年5月(3)
- 2014年4月(1)
- 2014年3月(1)
- 2014年2月(2)
- 2014年1月(1)
- 2013年12月(2)
- 2013年11月(2)
- 2013年10月(1)
- 2013年9月(3)
- 2013年8月(14)
- 2013年7月(7)
- 2013年4月(1)
- 2013年3月(4)
- 2013年2月(6)
- 2013年1月(6)
- 2012年12月(8)
- 2012年11月(6)