源于给客户做的一个系统, 基于传统的c/s架构(wpf+wcf), 后来因为客户需要, 就写了一些基于Web的查询小工具, 开发完了要部署的时候才发现, 服务器上并没有装IIS。
服务器是win 2003 server操作系统, 硬盘上没保留系统安装文件的备份,要装IIS就得跑一趟机房, 为做一个懒惰的程序员,就开始想方法找歪路啦。
Google之, 得到以下信息:
下载:
CassiniDev 3.5.1.8-4.1.0.8 release (官方下载)
下载回来的压缩包里有很多的exe及dll文件, 下面是每个文件的作用描述:
直接使用的:
CassiniDev.exe:对应.net framework 3.5, asp.net 2.0, windowform gui
CassiniDev4.exe: 对应.net framework 4, asp.net 4.0, windowform gui
CassiniDev-console.exe:对应.net framework 3.5, asp.net 2.0, 控制台程序
CassiniDev4-console.exe:对应.net framework 4, asp.net 4.0, 控制台程序
供二次开发的:
CassiniDev-lib.dll:对应.net framework 3.5, asp.net 2.0
CassiniDev4-lib.dll:对应.net framework 4, asp.net 4.0
供VS调试用的(即用来替换掉VS自带的ASP.Net development server):
WebDev.WebServer.exe
WebDev.WebServer20.exe
WebDev.WebServer40.exe
使用:
一 般情况下, 直接使用上面的exe便可实现asp.net的寄宿了, 但是相应的, 可供我们控制的就比较少, 不自由, 例如实际应用中可能需要把我们的宿主写成windows Service的形式, 直接用上面的exe就没法实现了, 这种情况下可以利用cassinidev-lib进行二次开发, 甚至是直接到官网上下载源代码来生成自己需要的程序, 下面是一段简单的例子,利用cassinidve4-lib.dll实现一个asp.net的host
在vs2010中新建一wpf应用程序, 在主窗口中加入一TextBox做显示信息用, 修改MainWindow代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using CassiniDev; namespace JKAspNetHost { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { private readonly Server server; public MainWindow() { InitializeComponent(); server = new Server(8038, "/", System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WebApp"), System.Net.IPAddress.Parse("0.0.0.0"), "", 0, false, false); server.Start(); textLog.AppendText("服务器运行中...\r\n"); textLog.AppendText(server.PhysicalPath + "\r\n"); textLog.AppendText(server.RootUrl + "\r\n"); server.RequestComplete += new EventHandler<RequestEventArgs>(server_RequestComplete); } void server_RequestComplete(object sender, RequestEventArgs e) { //可能由ui线程以外的线程调用, 所以需要Dispatcher.Invoke Dispatcher.Invoke(new Action(()=>{ textLog.AppendText("Request:" + e.RequestLog.Url + "\r\n"); if (textLog.Text.Length > 10000) { textLog.Text = textLog.Text.Substring(textLog.Text.Length - 1000, 1000); } textLog.ScrollToEnd(); })); } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { try { server.ShutDown(); } catch { } } } }