文章出處

用VS2015中創建了一個非常簡單的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("Hello, ASP.NET 5 world!"));
        }
    }
}

將Target KRE version改為CoreCLR:

在Visual Studio中按F5能正常運行,運行結果如下:

Hello, ASP.NET 5 world!

然后嘗試部署到IIS中運行,采用了2種方式:1)VS2015的Publish方式;2)手動復制文件的方式。

一、VS2015的Publish方式

發布出來有2個文件夾,一個是approot文件夾,一個是wwwroot文件夾:

將IIS站點指向wwwroot文件夾,就能正常運行。

Hello, ASP.NET 5 world!

看一下wwwroot文件夾中的內容:

神奇吧!就2個文件,一個是web.config,一個是AspNet.Loader.dll。

我寫的ASP.NET5程序跑哪去了?

打開web.config一看:

<configuration>
  <appSettings>
    <add key="kpm-package-path" value="..\approot\packages" />
    <add key="bootstrapper-version" value="1.0.0-beta1" />
    <add key="kre-package-path" value="..\approot\packages" />
    <add key="kre-version" value="1.0.0-beta1" />
    <add key="kre-clr" value="CoreCLR" />
    <add key="kre-app-base" value="..\approot\src\HelloAspNet5" />
  </appSettings>
</configuration>

看到kre-app-base,似乎知道了,進入approot\src\HelloAspNet5文件夾一看:

ASP.NET5應用程序果然在這,但不是HelloAspNet5.dll(bin中也只有startup.prof),而是源代碼。

難道部署ASP.NET 5應用程序要把源代碼一起部署?難道ASP.NET5在運行時動態編譯整個項目的源代碼?不解,這個問題暫且放一邊。

回過頭來看一下approot文件夾,只有2個文件夾,除了剛才看過的src文件夾,剩下就是packages文件夾:

不看不知道,一看嚇一跳!packages竟然有55.5M!

打開一看,哇!好多包包,數一數,有64個。看來運行ASP.NET5應用程序所需要的所有東西都在這了(除了AspNet.Loader.dll)。

再仔細一看,這么多包包中最耀眼的是一個超級豪華大包——KRE-CoreCLR-amd64.1.0.0-beta1,有50M。

這也是ASP.NET 5的一個變化,將運行環境與應用程序打包在一起,各個應用程序之間互不影響。

但是,運行一個只有寫了1行代碼的程序,竟然要帶上64個包包,有點說不過去。

下面試試手動部署。

二、嘗試手動部署

根據之前版本的ASP.NET應用程序部署經驗,先得將Web項目編譯成dll。但是在VS2015中即使成功編譯Web項目,bin中也不會有。

后來發現在項目的Build設置中選中Produce outputs on build,可以編譯出dll:

編譯出來的dll在artifacts\bin中可以找到,比如這里的artifacts\bin\HelloAspNet5\Release\aspnetcore50\HelloAspNet5.dll(編譯出來有162K)。

然后在IIS中新建一個站點,站點目錄中就放一個bin文件夾,其中只放一個HelloAspNet5.dll文件。

訪問時出現下面的錯誤:

HTTP Error 403.14 - Forbidden

這反過來證明AspNet.Loader.dll的用途,將它也復制到bin中。再訪問,依然出錯,但錯誤信息變了:

Couldn't determine an appropriate version of KRE to run.

參考第一種部署方式,通過web.config告訴AspNet.Loader所需要的KRE版本。于是添加web.config文件,添加如下的配置:

<configuration>
  <appSettings>
    <add key="kre-version" value="1.0.0-beta1" />
    <add key="kre-clr" value="CoreCLR" />
  </appSettings>
</configuration>

又出現新的錯誤:

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不會在當前Web站點的目錄中找,而是從上一級目錄一直找到根目錄。

這個問題好解決,建一個packages文件夾,將KRE-CoreCLR-amd64.1.0.0-beta1復制過來。

繼續出現新的錯誤,而這次是讓人束手無策的錯誤:

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產生了興趣。。。

目前IIS Web站點中的目錄結構:

【更新】

出現External component has thrown an exception異常之后,bin文件夾中會出現profile\startup.prof文件。

這里訪問的錯誤信息會變成:

The Main function returned unexpectedly with status code 0.

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()