http://www.cnblogs.com/tong-tong/archive/2013/05/02/3049428.html

大学玩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.Request的TryParseRequest()方法一个判断注释掉

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.Connection的GetHost()方法里加入如下代码(要把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

后记


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

WebDev.WebServer40.EXE的更多相关文章

  1. 开发系统时候运行程序突然报出“WebDev.WebServer40.exe已停止工作”的错误

    已经解决,问题描述:在开发系统时候运行程序突然报出“WebDev.WebServer40.exe已停止工作”的错误,程序调试运行,发现程序在打开数据库时候报错,也就是Connection.Open() ...

  2. vs2010旗舰版后,运行调试一个项目时调试不了,提示的是:无法使用“pc”附加到应用程序“webdev.webserver40.exe(PID:2260”

    具体问题描述: vs2010旗舰版后,运行调试一个项目时调试不了,能编译,按ctrl+f5 可以运行,但是就是调试就不行,提示的是:无法使用“pc”附加到应用程序“webdev.webserver40 ...

  3. ASP.NET程序运行出现WebDev.WebServer40.exe已停止工作解决方法(netsh winsock reset)

    问题描述:在开发系统时候运行程序突然报出"WebDev.WebServer40.exe已停止工作"的错误,程序调试运行,发现程序在打开数据库时候报错,也就是Connection.O ...

  4. C# 调用VS自带程序WebDev.WebServer40.EXE 源代码

    通过Process.Start启动,VS自带程序WebDev.WebServer40.EXE 在内网架设网站时,为安装IIS条件下用VS自带的小程序来测试效果非常不错! using System; u ...

  5. 在开发系统时候运行程序突然报出“WebDev.WebServer40.exe已停止工作”的错误的解决办法

    问题描述:在开发系统时候运行程序突然报出“WebDev.WebServer40.exe已停止工作”的错误,程序调试运行,发现程序在打开数据库时候报错,也就是Connection.Open()处. 但是 ...

  6. WebDev.WebServer40.EXE命令使用

    "C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0\WebDev.WebServer40.EXE&quo ...

  7. 用WebDev.WebServer40.EXE调试VS代码

    1.找到WebDev.WebServer40的录井,一般位于C:/Program Files (x86)/Common Files/Microsoft Shared/DevServer/10.0/We ...

  8. WebDev.WebServer40.exe已停止工作

    今天写程序的遇到这个错误 错误的原因是代码中有死循环

  9. VS WebDev.WebServer40

    vs2010下有一个WebDev.WebServer40工具,可以直接拿来当服务器用,这样就不用再安装iis了.位置在 C:\Program Files (x86)\Common Files\micr ...

随机推荐

  1. Python---查看安装路径

    python是解释型脚本语言,在执行时,逐句解释执行,不需要进行预编译.但需要有自身的Python解释器. 所以在执行Python代码时,需要指定python解释器. 指定解释器方法: 在文件开头添加 ...

  2. ASP.NET XML文件

    XML是一种标记语言,具有描述所有已知和未知数据的能力.XML扩展性比较好,可以为新的数据类型制定新的数据描述规则,作为对标记集的扩展. XML的特点: 1.XML数据可以跨平台使用并可以被人阅读理解 ...

  3. A8ERP权限管理系统

  4. http请求和响应头部

    说一说常见的请求头和响应头都有什么呢? 1)请求(客户端->服务端[request])     GET(请求的方式) /newcoder/hello.html(请求的目标资源) HTTP/1.1 ...

  5. Python多线程爬图&Scrapy框架爬图

    一.背景 对于日常Python爬虫由于效率问题,本次测试使用多线程和Scrapy框架来实现抓取斗图啦表情.由于IO操作不使用CPU,对于IO密集(磁盘IO/网络IO/人机交互IO)型适合用多线程,对于 ...

  6. jboss 配置虚拟路径

    1.找到jboss服务器下server.xml文件.我用的是web用户,所以在web用户下找 路径:G:\skWorkspace\Jboss\server\web\deploy\jbossweb.sa ...

  7. 用DataReader 分页与几种传统的分页方法的比较

    对于数据库的分页,目前比较传统的方法是采用分页存储过程,其实用 DataReader 也可以实现分页,不需要写存储过程,实现效率上也比几种比较流行的分页方法要略快. 在开始这个方法之前,让我们先创建一 ...

  8. 如何让不同浏览器调用不同的CSS样式

    如何让不同浏览器调用不同的CSS样式 由 于对W3C标准支持程度的不同,往往导致同一个CSS样式表在各种Web浏览器中的呈现大相径庭.以目前市场占有率最高的两个浏览器Microsoft Interne ...

  9. 2-2 列表推导同 filter 和 map 的比较

    列表推导同 filter 和 map 的比较 参考廖雪峰的文档: filter()函数:用于过滤序列. filter()接收一个函数和一个序列.把传入的函数依次作用于传入的序列的每个元素,根据返回值是 ...

  10. Context Switches msdn

    Context Switches  https://msdn.microsoft.com/en-us/library/ms682105(VS.85).aspx The scheduler mainta ...