自从Vs2005起,Vs开发环境便自带了WebDev.WebServer,就是这个图标,它实际上是一个小型的Web服务器,专用于.net平台。大家经常调试程序它还是相当的方便,经过小小的配置就可以指向某个文件夹,使该文件夹成为网站目录已供访问。
WebDev.WebServer确实很轻便,同时它本身是.net程序,才2个文件,作为测试和演示环境是非常的好用,在xp也能很好的运行,Xp的IIS5实在是不方便用。
但是自带的WebDev.WebServer只能用于本机,那是因为MS对其进行了限制,因为作出它的目的,本身是为了Vs的开发更方便而已,但是很多测试也是基于网络的,至少你不希望别人测试一些网站,总得来用你的电脑吧。
WebDev.WebServer一共是两个文件,一个是WebDev.WebServer.exe,另一个是WebDev.WebHost.dll,另外说一下WebDev.WebServer是安装开发环境才有的,不是安装.net framework里面的东东,所以你提取这两个文件都需要已经安装有开发环境下来进行。
新建一个项目 StartExamples
在Program类中加入以下代码:
{
[STAThread]
private static void Main( string [] args)
{
string currentDirectory = Environment.CurrentDirectory;
string appName = "" ;
ProcessParameters(args, ref currentDirectory, ref appName);
string devServerExecutable = GetDevServerExecutable(CheckQsf40(currentDirectory));
string portNumber = GetPortNumber();
if ( ! File.Exists(devServerExecutable)){
Console.WriteLine( " Cannot find the ASP.NET Development Server! " );
} else {
StartProcess(devServerExecutable, portNumber, currentDirectory, appName);
}
}
private static void ProcessParameters( string [] args, ref string physPath, ref string appName)
{
foreach ( string str in args)
{
if (str.StartsWith( " -path: " , StringComparison.OrdinalIgnoreCase))
{
physPath = str.Remove( 0 , 6 );
}
else if (str.StartsWith( " -appname: " , StringComparison.OrdinalIgnoreCase))
{
appName = str.Remove( 0 , 9 );
}
else if (str.StartsWith( " -help " , StringComparison.OrdinalIgnoreCase) || str.StartsWith( " -? " , StringComparison.OrdinalIgnoreCase))
{
ShowHelp();
}
}
}
private static void ShowHelp()
{
MessageBox.Show( " Usage: {0} [-path:<path to root of web>] [-appname:/<name of web application>] " ,
Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf( @" \ " ) + 1 ));
}
private static string GetDevServerExecutable( bool check40)
{
string str = string .Empty;
string path = string .Empty;
if (check40)
{
path = string .Format( @" {0}\Microsoft Shared\DevServer\10.0\WebDev.WebServer40.exe " , Environment.GetEnvironmentVariable( " CommonProgramFiles " ));
if (File.Exists(path)){
str = path;
} else {
path = string .Format( @" {0}\Microsoft Shared\DevServer\10.0\WebDev.WebServer40.exe " , Environment.GetEnvironmentVariable( " CommonProgramFiles(x86) " ));
if (File.Exists(path)){
str = path;
}
}
}
if (str.Length == 0 ){
path = string .Format( @" {0}\Microsoft Shared\DevServer\10.0\WebDev.WebServer20.exe " , Environment.GetEnvironmentVariable( " CommonProgramFiles " ));
if (File.Exists(path)){
str = path;
} else {
path = string .Format( @" {0}\Microsoft Shared\DevServer\10.0\WebDev.WebServer20.exe " , Environment.GetEnvironmentVariable( " CommonProgramFiles(x86) " ));
if (File.Exists(path)){
str = path;
}
}
}
if (str.Length == 0 ){
path = string .Format( @" {0}\Microsoft Shared\DevServer\9.0\WebDev.WebServer.exe " , Environment.GetEnvironmentVariable( " CommonProgramFiles " ));
if (File.Exists(path)){
str = path;
} else {
path = string .Format( @" {0}\Microsoft Shared\DevServer\9.0\WebDev.WebServer.exe " , Environment.GetEnvironmentVariable( " CommonProgramFiles(x86) " ));
if (File.Exists(path)){
str = path;
}
}
}
if (str.Length != 0 ){
return str;
}
string str3 = " 50727 " ;
RegistryKey key = Registry.LocalMachine.OpenSubKey( @" SOFTWARE\Microsoft\.NETFramework\policy\v2.0 " );
if ((key != null ) && (key.ValueCount > 0 )){
str3 = key.GetValueNames()[ 0 ];
} else {
MessageBox.Show( " Error while reading .NET Framework 2.0 configuration! Assuming default values. " );
}
return string .Format( @" {0}\Microsoft.NET\Framework\v2.0.{1}\WebDev.WebServer.exe " , Environment.GetEnvironmentVariable( " WINDIR " ), str3);
}
private static bool CheckQsf40( string physPath)
{
string path = physPath + @" \Web.Config " ;
if (File.Exists(path)){
StreamReader reader = new StreamReader(path);
string str2 = reader.ReadToEnd();
reader.Close();
return (str2.IndexOf( " System.Data.Linq, Version=4.0.0.0 " ) != - 1 );
}
return false ;
}
private static string GetPortNumber()
{
bool flag = false ;
TcpListener listener = null ;
int port = 0 ;
try
{
listener = new TcpListener(IPAddress.Any, 0x206d );
listener.ExclusiveAddressUse = true ;
listener.Start();
port = ((IPEndPoint)listener.LocalEndpoint).Port;
listener.Stop();
}
catch (SocketException)
{
flag = true ;
}
if (flag)
{
try
{
listener = new TcpListener(IPAddress.Any, 0 );
listener.Start();
port = ((IPEndPoint)listener.LocalEndpoint).Port;
listener.Stop();
}
catch (Exception)
{
}
}
if (port == 0 )
{
port = 0x206d ;
}
return port.ToString();
}
private static void StartProcess( string cassiniExecutable, string portNumber, string physPath, string appName)
{
Process process = new Process();
process.StartInfo.FileName = cassiniExecutable;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.Arguments = string .Format( " /port:{0} /path:\"{1}\" /vpath:\"{2}\" " , portNumber, physPath, appName);
process.Start();
new WaitMessageForm().ShowDialog();
Process process2 = new Process();
process2.StartInfo.UseShellExecute = true ;
process2.StartInfo.FileName = string .Format( " http://localhost:{0}{1} " , portNumber, appName);
process2.Start();
}
}
在StartExamples项目中加入 WaitMessageForm 窗体加入以下代码:
{
private IContainer components;
private Label label1;
public WaitMessageForm()
{
this .InitializeComponent();
}
private void InitializeComponent()
{
ComponentResourceManager manager = new ComponentResourceManager( typeof (WaitMessageForm));
this .label1 = new System.Windows.Forms.Label();
this .SuspendLayout();
//
// label1
//
this .label1.AutoSize = true ;
this .label1.Font = new System.Drawing.Font( " Microsoft Sans Serif " , 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, (( byte )( 0 )));
this .label1.Location = new System.Drawing.Point( 26 , 26 );
this .label1.Name = " label1 " ;
this .label1.Size = new System.Drawing.Size( 517 , 20 );
this .label1.TabIndex = 0 ;
this .label1.Text = " Please wait while the ASP.NET Development Server is started... " ;
this .label1.UseWaitCursor = true ;
//
// WaitMessageForm
//
this .AccessibleDescription = " ASP.NET Development server loader " ;
this .AccessibleName = " Start Examples " ;
this .AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
this .AutoScaleDimensions = new SizeF(6f, 13f);
this .AutoScaleMode = AutoScaleMode.Font;
this .CausesValidation = false ;
this .ClientSize = new System.Drawing.Size( 575 , 70 );
this .ControlBox = false ;
this .Controls.Add( this .label1);
this .FormBorderStyle = FormBorderStyle.None;
this .Name = " WaitMessageForm " ;
this .StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this .Text = " Loading... " ;
this .UseWaitCursor = true ;
this .ResumeLayout( false );
this .PerformLayout();
}
protected override void OnLoad(EventArgs e)
{
base .OnLoad(e);
Timer timer = new Timer();
timer.Interval = 0xfa0 ;
timer.Tick += new EventHandler( this .closeTimer_Tick);
timer.Start();
}
private void closeTimer_Tick( object sender, EventArgs e)
{
((Timer)sender).Stop();
((Timer)sender).Dispose();
base .Close();
}
protected override void Dispose( bool disposing)
{
if (disposing && ( this .components != null ))
{
this .components.Dispose();
}
base .Dispose(disposing);
}
}
运行效果
快速启动WebDev.WebServer的方法
直接通过文件夹的快捷菜单来启动WebDev.WebServer。
简单来说就是建立一个注册表文件,写入下列内容:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREClassesFoldershellVS2005 WebServer]
@="启动Web服务器"
[HKEY_LOCAL_MACHINESOFTWAREClassesFoldershellVS2005 WebServercommand]
@="C:\Windows\Microsoft.NET\Framework\v2.0.50727\Webdev.WebServer.exe /port:8080 /path:"%1""
注意这里是依照安装了VS2005的情况,如果是VS2008的话,Webdev.WebServer.exe的目录变了,应当做如下改写:
[HKEY_LOCAL_MACHINESOFTWAREClassesFoldershellVS2008 WebServer]
@="启动Web服务器"
[HKEY_LOCAL_MACHINESOFTWAREClassesFoldershellVS2008 WebServercommand]
@="C:\Program Files\Common Files\Microsoft Shared\DevServer\9.0\Webdev.WebServer.exe /port:8080 /path:"%1""
如果安装VS的时候没有选择默认的安装目录,请自行修改以上内容。
建立这个注册表文件以后,只要双击写入到注册表就可以了,想要启动,只要在文件夹上单击右键就OK了。
这个时候可以看到Webdev.WebServer已经启动,打开浏览器就可以访问了。
set path=%path%;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
WebDev.WebServer.EXE /path:”C:\Inetpub\wwwroot”
这样每次启动就比较方便了。