在WinForm程序中嵌入ASP.NET
???? 因為安全以及其它一些方面的原因,在使用ASP.NET引擎之前,必須建立一個新的AppDomain。簡單的方法是直接使用ApplicationHost.CreateApplicationHost函數為指定的虛擬目錄和物理路徑建立ASP.NET引擎宿主的實例,如
?
// should create a subdirectory ./bin and copy the assembly to it
static public WebHost Create(string name, string path)
{
???? if(!name.StartsWith(new string(Path.AltDirectorySeparatorChar, 1)))
???? {
?????? name = Path.AltDirectorySeparatorChar + name;
???? }
???? webhost host = (webhost)applicationhost.createapplicationhost(
?????? typeof(WebHost), name, path);
???? host.setvirtualdirectory(name);
???? host.setBaseDirectory(path);
???? return host;
}
?
但這樣建立的程序有個bt的要求,他會在指定目錄的bin子目錄中去嘗試載入宿主類型(webhost)的assembly,也就是說你必須把程序在bin子目錄下復制一份,非常不爽。解決方法是自己手工完成整個建立過程,如下:
?
static public WebHost Create(string virtualDir, string physicalDir){
???? if(!virtualDir.StartsWith(new string(Path.AltDirectorySeparatorChar, 1)))
???? {
?????? virtualDir = Path.AltDirectorySeparatorChar + virtualDir;
???? }
?
???? if(!physicaldir.endswith(new string(path.directoryseparatorchar, 1)))
???? {
?????? physicalDir += Path.DirectorySeparatorChar;
???? }
???? appdomainsetup setup = new appdomainsetup();
???? setup.applicationname = "app_" + guid.newguid().tostring();
???? setup.ConfigurationFile = "web.config";
???? appdomain domain = appdomain.createdomain("asphost_" + guid.newguid().tostring(), null, setup);
???
???? domain.SetData(".appDomain", "*");
???? domain.SetData(".appPath", physicalDir);
???? domain.SetData(".appVPath", virtualDir);
???? domain.SetData(".domainId", domain.FriendlyName);
???? domain.SetData(".hostingVirtualPath", virtualDir);
???? domain.SetData(".hostingInstallDir", HttpRuntime.AspInstallDirectory);
???? webhost host = (webhost)domain.createinstanceandunwrap(
?????? typeof(WebHost).Module.Assembly.FullName, typeof(WebHost).FullName);
???? host.setapplicationdomain(domain);
???? host.setVirtualDirectory(virtualDir);
???? host.setBaseDirectory(physicalDir);
???? return host;
}
?
這兒的一堆domain.setdata是傳遞參數給asp.net引擎。然后在那個appdomain中建立新的宿主類型的實例。這樣就避免多份代碼的尷尬。而使用asp.net就比較簡單了,在宿主類中使用HttpRuntime.ProcessRequest函數處理特定請求。簡單一點的話,可以直接用SimpleWorkerRequest包裝請求,生成頁面到一個指定的TextWriter中,如
?
private void DoRequest(string page, string query, TextWriter writer){
???? HttpRuntime.ProcessRequest(new SimpleWorkerRequest(page, query, writer));
}
?
public void requestpage(string page, string query, stream stream)
{??????
???? DoRequest(page, query, new StreamWriter(stream));
}
public void requestpage(string page, stream stream)
{
???? RequestPage(page, null, stream);
}
public string requestpage(string page, string query)
{
???? using(StringWriter writer = new StringWriter())??????
???? {
?????? DoRequest(page, query, writer);
?????? return writer.tostring();
???? }
}
public string requestpage(string page)
{
???? return RequestPage(page, string.Empty);
}
?
這個缺省的請求包裝使用是簡單,但對中文的兼容性不太好,過兩天有空再自己寫個強一點的吧,呵呵
最終類的使用就比較簡單了,在winform程序中建立一個singleton模式的屬性
?
static private WebHost.WebHost _host = null;?
public webhost.webhost host
{
???? get
???? {
?????? if(_host == null)
?????? {
???????? _host = WebHost.WebHost.Create();
?????? }
?????? return _host;
???? }
}
?
然后請求指定的asp.net頁面,如
html = host.requestpage(_page);
即可完成從動態的asp.net腳本到靜態html的轉換。嵌入winform程序中,還可以通過host類型完成兩者之間的雙向通訊,實現互相控制。下次有空繼續,呵呵
參考資料:
???? 1.Using the ASP.Net Runtime for extending desktop applications with dynamic HTML Scripts
?????http://www.west-wind.com/presentations/aspnetruntime/aspnetruntime.asp
???? 2.executing asmx files without a web server???????http://radio.weblogs.com/0105476/stories/2002/10/24/executingAsmxFilesWithoutAWebServer.html
???? 3.asp. net client-side hosting with cassini
?????http://msdn.microsoft.com/msdnmag/issues/03/01/CuttingEdge/
???? 4.using asp.net runtime in desktop applications
?????http://www.codeguru.com/cs_internet/UsingAspRuntime.html
轉載于:https://www.cnblogs.com/cxd4321/archive/2007/11/02/947273.html
總結
以上是生活随笔為你收集整理的在WinForm程序中嵌入ASP.NET的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带郎的网名144个
- 下一篇: 如何手动运行ASP.NET 2.0 De