在IIS中部署ASP.NET 5應(yīng)用程序遭遇的問題
本文關(guān)鍵詞:ASP.NET應(yīng)用,由筆耕文化傳播整理發(fā)布。
用VS2015中創(chuàng)建了一個非常簡單的ASP.NET5程序:
在Startup.cs中只輸入一行代碼:
using System; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace HellowAspNet5 { public class Startup { public void Configure(IApplicationBuilder app) { app.Run(context => context.Response.WriteAsync()); } } }
將Target KRE version改為CoreCLR:
在Visual Studio中按F5能正常運行,運行結(jié)果如下:
Hello, ASP.NET 5 world!
然后嘗試部署到IIS中運行,采用了2種方式:1)VS2015的Publish方式;2)手動復(fù)制文件的方式。
一、VS2015的Publish方式
發(fā)布出來有2個文件夾,一個是approot文件夾,,一個是wwwroot文件夾:
將IIS站點指向wwwroot文件夾,就能正常運行。
Hello, ASP.NET 5 world!
看一下wwwroot文件夾中的內(nèi)容:
神奇吧!就2個文件,一個是web.config,一個是AspNet.Loader.dll。
我寫的ASP.NET5程序跑哪去了?
打開web.config一看:
看到kre-app-base,似乎知道了,進(jìn)入approot\src\HelloAspNet5文件夾一看:
ASP.NET5應(yīng)用程序果然在這,但不是HelloAspNet5.dll(bin中也只有startup.prof),而是源代碼。
難道部署ASP.NET 5應(yīng)用程序要把源代碼一起部署?難道ASP.NET5在運行時動態(tài)編譯整個項目的源代碼?不解,這個問題暫且放一邊。
回過頭來看一下approot文件夾,只有2個文件夾,除了剛才看過的src文件夾,剩下就是packages文件夾:
不看不知道,一看嚇一跳!packages竟然有55.5M!
打開一看,哇!好多包包,數(shù)一數(shù),有64個?磥磉\行ASP.NET5應(yīng)用程序所需要的所有東西都在這了(除了AspNet.Loader.dll)。
再仔細(xì)一看,這么多包包中最耀眼的是一個超級豪華大包——KRE-CoreCLR-amd64.1.0.0-beta1,有50M。
這也是ASP.NET 5的一個變化,將運行環(huán)境與應(yīng)用程序打包在一起,各個應(yīng)用程序之間互不影響。
但是,運行一個只有寫了1行代碼的程序,竟然要帶上64個包包,有點說不過去。
下面試試手動部署。
二、嘗試手動部署
根據(jù)之前版本的ASP.NET應(yīng)用程序部署經(jīng)驗,先得將Web項目編譯成dll。但是在VS2015中即使成功編譯Web項目,bin中也不會有。
后來發(fā)現(xiàn)在項目的Build設(shè)置中選中Produce outputs on build,可以編譯出dll:
編譯出來的dll在artifacts\bin中可以找到,比如這里的artifacts\bin\HelloAspNet5\Release\aspnetcore50\HelloAspNet5.dll(編譯出來有162K)。
然后在IIS中新建一個站點,站點目錄中就放一個bin文件夾,其中只放一個HelloAspNet5.dll文件。
訪問時出現(xiàn)下面的錯誤:
HTTP Error 403.14 - Forbidden
這反過來證明AspNet.Loader.dll的用途,將它也復(fù)制到bin中。再訪問,依然出錯,但錯誤信息變了:
Couldn't determine an appropriate version of KRE to run.
參考第一種部署方式,通過web.config告訴AspNet.Loader所需要的KRE版本。于是添加web.config文件,添加如下的配置:
又出現(xiàn)新的錯誤:
Couldn't find package 'KRE-CoreCLR-amd64.1.0.0-beta1'. Locations probed: E:\AspNet5\WebSites\packages\KRE-CoreCLR-amd64.1.0.0-beta1 E:\AspNet5\packages\KRE-CoreCLR-amd64.1.0.0-beta1 E:\packages\KRE-CoreCLR-amd64.1.0.0-beta1
找不到CoreCLR的包,從中可以看出AspNet.Loader不會在當(dāng)前Web站點的目錄中找,而是從上一級目錄一直找到根目錄。
這個問題好解決,建一個packages文件夾,將KRE-CoreCLR-amd64.1.0.0-beta1復(fù)制過來。
繼續(xù)出現(xiàn)新的錯誤,而這次是讓人束手無策的錯誤:
External component has thrown an exception. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.Runtime.InteropServices.SEHException: External component has thrown an exception. Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. Stack Trace: [SEHException (0x80004005): External component has thrown an exception.] System.Web.HttpRuntime.HostingInit(HostingEnvironmentFlags hostingFlags, PolicyLevel policyLevel, Exception appDomainCreationException) +361 [HttpException (0x80004005): External component has thrown an exception.] System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +541 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +122 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +731
然后。。。就沒有然后了,昨天折騰了半天也沒解決這個問題。
然后。。。今天就寫了這篇隨筆。
然后。。。對AspNet.Loader.dll產(chǎn)生了興趣。。。
目前IIS Web站點中的目錄結(jié)構(gòu):
【更新】
出現(xiàn)External component has thrown an exception異常之后,bin文件夾中會出現(xiàn)profile\startup.prof文件。
這里訪問的錯誤信息會變成:
The Main function returned unexpectedly with status code 0.
本文關(guān)鍵詞:ASP.NET應(yīng)用,由筆耕文化傳播整理發(fā)布。
本文編號:50137
本文鏈接:http://sikaile.net/kejilunwen/jisuanjikexuelunwen/50137.html