开发者社区> 杰克.陈> 正文

通通WPF随笔(2)——自己制作轻量级asp.net网站服务

简介: 原文:通通WPF随笔(2)——自己制作轻量级asp.net网站服务          大学玩asp.net时就发现VS在Debug时会起一个web服务,这东西也太神奇了服务起得这么快,而相对于IIS又这么渺小。
+关注继续查看
原文:通通WPF随笔(2)——自己制作轻量级asp.net网站服务

 


       大学玩asp.net时就发现VS在Debug时会起一个web服务,这东西也太神奇了服务起得这么快,而相对于IIS又这么渺小。

       前几个月在用phonegap+jqmobi(被inter收购后叫App Framework)做手机应用开发。用dreamweaver CS6的云编译确实挺方便的,但是写代码的话还是比较喜欢VS的代码联想。本地调试时,点击又启动了这个web服务。

       再后来要开发一个在WPF嵌入网页的控件,果断用WebBrowser控件简单地封装了一下,这样发现当只是打开本地的html页面时就会弹出安全阻止信息,需要手动点一下允许,度娘的各种改IE设置就是没用,最后发现通过访问web服务返回的页面就不会弹出该提示了。第一反映就是用VS自带的这个来实现,但是托盘会弹气泡等,所以不得不改造下了。

 用360查看该端口定位文件

 

 

151KB,还绿色版,这也太牛了。但是但我用局域网地址进行访问时就发现不可访问,这是为什么呢?有点太可惜了所以就上网找了这个exe的相关资料,有人已经修改了可以局域网访问了,但是他改的东西下载下来报错,于是就决定自己动手进行修改。

仔细阅读之前各位大神写的文章后,综合优化了一下,终于出现了,真正绿色版(.NET 4.0),win8下完美运行:

 纯正绿色版,无任何微软信息

 

 

1.修改过程


  把WebDev.WebServer40.EXE拖到ILSpy.exe里进行反编译成项目(本人比较支持免费软件)

  同样也反编译应用的WebDev.WebHost40成项目

server里对host的引用删了,重新引用刚反编译的项目。

修改Microsoft.VisualStudio.WebHost.Server里的方法Start(),修改的代码如下:

 

if (Socket.OSSupportsIPv6)
            {
                try
                {
                    this._socketIpv6 = this.CreateSocketBindAndListen(AddressFamily.InterNetworkV6, IPAddress.IPv6Any, this._port);
                }
                catch (SocketException ex)
                {
                    if (ex.SocketErrorCode == SocketError.AddressAlreadyInUse || !flag)
                    {
                        throw;
                    }
                }
            }
            if (flag)
            {
                try
                {
                    this._socketIpv4 = this.CreateSocketBindAndListen(AddressFamily.InterNetwork, IPAddress.Any, this._port);
                }
                catch (SocketException)
                {
                    if (this._socketIpv6 == null)
                    {
                        throw;
                    }
                }
            }

 

 Microsoft.VisualStudio.WebHost.RequestTryParseRequest()方法一个判断注释掉

private bool TryParseRequest()
        {
            this.Reset();
            this.ReadAllHeaders();
            //if (!this._connection.IsLocal)
            //{
            //    this._connection.WriteErrorAndClose(403);
            //    return false;
            //}
            if (this._headerBytes == null || this._endHeadersOffset < 0 || this._headerByteStrings == null || this._headerByteStrings.Count == 0)
            {
                this._connection.WriteErrorAndClose(400);
                return false;
            }

这时候F6编译一下发现 Microsoft.VisualStudio.WebHost.NtlmAuth下的Authenticate()方法报一大堆Fixed关键字错误,做如下修改骗过编译器

fixed (SecHandle* lptr = (&this._securityContext))
            {
                IntPtr* ptr = (IntPtr*)lptr;
                fixed (SecBuffer* lptr2 = (&this._inputBuffer))
                {
                    IntPtr* ptr2 = (IntPtr*)lptr2;
                    fixed (SecBuffer* lptr3 = (&this._outputBuffer))
                    {
                        IntPtr* ptr3 = (IntPtr*)lptr3;
                        fixed (byte* lptr4 = (&array[0]))
                        {
                            IntPtr* ptr4 = (IntPtr*)lptr4;
                            fixed (byte* lptr5 = (&array2[0]))
                            {
                                IntPtr* ptr5 = (IntPtr*)lptr5;
                                IntPtr phContext = IntPtr.Zero;
                                if (this._securityContextAcquired)
                                {
                                    phContext = (IntPtr)((void*)ptr);
                                }

Microsoft.VisualStudio.WebHost.ConnectionGetHost()方法里加入如下代码(要把WebDev.WebHost40.dll复制到站点目录的bin目录下):

lock (this._lockObject)
                {
                    host = this._host;
                    if (host == null)
                    {
                        //复制当前dll到站点目录
                        Assembly myAss = Assembly.GetExecutingAssembly();
                        string assUrl = myAss.Location;
                        if (!File.Exists(this._physicalPath + "\\bin\\" + myAss.FullName.Split(',')[0] + ".dll"))
                        {
                            if (!Directory.Exists(this._physicalPath + "\\bin"))
                            {
                                Directory.CreateDirectory(this._physicalPath + "\\bin");
                            }
                            File.Copy(assUrl, this._physicalPath + "bin\\" + myAss.FullName.Split(',')[0]+".dll");
                        }
                       
                        string text = (this._virtualPath + this._physicalPath).ToLowerInvariant();
                        string appId = text.GetHashCode().ToString("x", CultureInfo.InvariantCulture);
                        this._host = (Host)this._appManager.CreateObject(appId, typeof(Host), this._virtualPath, this._physicalPath, false);
                        this._host.Configure(this, this._port, this._virtualPath, this._physicalPath, this._requireAuthentication, this._disableDirectoryListing);
                        host = this._host;
                    }
                }

最后一步,为WebDev.WebHost40.dll添加签名,不然运行时还是会去加载自带的WebDev.WebHost40.dll

编译一下,这样运行WebDev.WebServer40.EXE加载本地路径就可以局域网访问了。

为了简单易用,我用WPF做了窗口来方便WebServer40.EXE启动参数的传递,在传递参数时多加入一个“/silent:true”参数就可以静默运行了。具体怎么启动怎么传参具体我就不说了,参看Process这个类。

 运行如下:

 

 

下载地址:

http://files.cnblogs.com/tong-tong/TTWebServer.zip

 

 

 参考文献:

 http://www.cnblogs.com/huigll/archive/2011/02/25/1851112.html

  

后记


  近来在各种房贷、老婆贷的压力下接了各种私活,各种加班,各种被坑,不过数钱时还是比较爽的~~~当今物价都在上涨,唯独工资不涨,那钱都去了哪里了呢???

 

 

 

 

  

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用Nginx对ASP.NETCore网站或D ocker等进行反向代理,宝塔面板对ASP.NET Core 反向代理
使用Nginx对ASP.NETCore网站或D ocker等进行反向代理,宝塔面板对ASP.NET Core 反向代理
204 0
ASP.NET Core 返回文件、用户 下载文件,从网站下载文件,动态下载文件
ASP.NET Core 返回文件、用户 下载文件,从网站下载文件,动态下载文件
319 0
Asp.net core项目实战 新闻网站+后台 源码、设计原理、视频教程
Asp.net core项目实战 新闻网站+后台 源码、设计原理、视频教程
160 0
5分钟快速安装ASP.NET Core 网站运行环境
简介 ASP.NET Core 是新一代的 ASP.NET,早期称为 ASP.NET vNext,并且在推出初期命名为 ASP.NET 5,但随着 .NET Core 的成熟,以及 ASP.NET 5 的命名会使得外界将它视为 ASP.NET 的升级版,但它其实是新一代从头开始打造的 ASP.NET 核心功能,因此微软宣布将它改为与 .NET Core 同步的名称,即 ASP.NET Core。
2482 0
通通WPF随笔(4)——通通手写输入法(基于Tablet pc实现)
原文:通通WPF随笔(4)——通通手写输入法(基于Tablet pc实现)          从我在博客园写第一篇博客到现在已经有1年半了,我的第一篇博客写的就是手写识别,当时,客户需求在应用中加入手写输入功能,由于第三方的手写输入法都无法定制界面,所以领导决定自主开发,所以我就很简单地基于Tablet pc写了一个WPF控件,由于几个瓶颈问题,导致这个输入功能只能在我们的UI框架里使用,而无法做到像输入法那样可以输入到任意窗口。
1946 0
通通WPF随笔(3)——艺术二维码素材生成器
原文:通通WPF随笔(3)——艺术二维码素材生成器       最近公司让我开发一个条形码的生成控件,花了半天时间搞定觉得不过瘾,什么年代了该用二维码了吧。于是wiki了一下二维码的资料。   比较常见的就是QR码(Quick Response)即快速识别码,为了验证“快速”,我特地和条形码做了一次比较:经过我测试条形码的code 128编码方式可以表示数字、字母、和符号,而且长度也可以很长。
1223 0
通通WPF随笔(1)——基于lucene.NET让ComboBox拥有强大的下拉联想功能
原文:通通WPF随笔(1)——基于lucene.NET让ComboBox拥有强大的下拉联想功能       我一直很疑惑百度、谷哥搜索框的下拉联想功能是怎么实现的?是不断地查询数据库吗?其实到现在我也不知道,他们是怎么实现这么高效的。
1216 0
ASP.NET Core 一步步搭建个人网站(5)_Api模拟和网站分析
前言 经过前面几章,我们的网站已经最基本的功能,接下来就是继续拓展其他的功能,这期一起来实现一个该网站流量分析的工具,统计出这个网站每天用户相关数据,不仅要满足了我们对流量统计数字的基本要求,并且用更简单的图形显示方式,让我们一目了然地获取页面热度、点击率信息等等。
1356 0
+关注
杰克.陈
一个安静的程序猿~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载