文章出處

今天坐高鐵時嘗試了一種學習ASP.NET 5的笨方法,從空文件夾開始,根據運行dnx . kestrel命令的錯誤信息,一步一步寫代碼,直至將一個最簡單的ASP.NET程序運行起來。

嘗試的具體步驟如下。

新建一個空文件夾HelloCnblogs:

mkdir HelloCnblogs && cd $_

在這個空HelloCnblogs文件夾中運行 dnx . kestrel 命令(基于CoreCLR的dnx),運行結果是如下的出錯信息: 

System.InvalidOperationException: Unable to resolve project 'HelloCnblogs' from /Git/HelloCnblogs
   at Microsoft.Framework.Runtime.ApplicationHostContext..ctor
...

添加一個空project.json文件(命令為touch project.json),運行dnx . kestrel命令,錯誤信息如下:

Error: Microsoft.Framework.Runtime.FileFormatException: 
The JSON file can't be deserialized to a JSON object. at Microsoft.Framework.Runtime.Project.GetProjectFromStream(
Stream stream, String projectName, String projectPath, ICollection`1 diagnostics)

在project.json文件中添加 {} ,運行dnx . kestrel命令,錯誤信息如下:

System.InvalidOperationException: Unable to load application or execute command 'kestrel'.
at Microsoft.Framework.ApplicationHost.Program.ThrowEntryPointNotfoundException(
DefaultHost host, String applicationName, Exception innerException)

在project.json中添加kestrel command:

"commands": {
    "kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:8080"
}

運行dnx . kestrel,出錯信息如下:

System.InvalidOperationException: Unable to load application or execute command 'Microsoft.AspNet.Hosting'. 
Available commands: kestrel.
   at Microsoft.Framework.ApplicationHost.Program.ThrowEntryPointNotfoundException(
   DefaultHost host, String applicationName, Exception innerException)

在project.json中添加對Kestrel的引用

"dependencies": {
	"Kestrel": "1.0.0-*"
}

運行dnu restore之后(基于mono的dnu),再運行dnx . kestrel,出錯信息變為:

System.InvalidOperationException: 
Failed to resolve the following dependencies for target framework 'DNXCore,Version=v5.0':
   Kestrel 1.0.0-beta6-11871

在project.json中添加frameworks:

"frameworks": {
     "dnxcore50": { }
}

運行dnu restore && dnx . kestrel,出現錯誤:

System.InvalidOperationException: A type named 'StartupProduction' or 'Startup' could not be found in assembly 'HelloCnblogs'.
at Microsoft.AspNet.Hosting.Startup.StartupLoader.FindStartupType(String startupAssemblyName, IList`1 diagnosticMessages)

創建Startup.cs文件,并添加一個Startup類:

namespace HelloCnblogs
{
    public class Startup
    {        
    }
}

繼續dnx . kestrel,出現錯誤:

System.InvalidOperationException: 
A method named 'ConfigureProduction' or 'Configure' in the type 'HelloCnblogs.Startup' could not be found.
   at Microsoft.AspNet.Hosting.Startup.StartupLoader.FindMethod(
   Type startupType, String methodName, String environmentName, Type returnType, Boolean required)

給Startup類添加Configure方法:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
    }    
}

繼續dnx . kestrel,出現錯誤:

error CS0246: The type or namespace name 'IApplicationBuilder' could not be found (are you missing a using directive or an assembly reference?)

在Startup.cs中添加命名空間:

using Microsoft.AspNet.Builder;

繼續dnx . kestrel,這次成功運行!

Started

這里用瀏覽器訪問 http://localhost:8080/ ,能成功訪問,但頁面一片空白,因為我們在程序中沒進行任何內容輸出操作。

于是,在Startup.cs中添加輸入內容的代碼:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Run(async context => await context.Response.WriteAsync("Hello, cnblogs!"));
    }    
}

繼續用dnx . kestrel命令運行,出現錯誤:

error CS1061: 'HttpResponse' does not contain a definition for 'WriteAsync' and no extension method 'WriteAsync' accepting a first argument of type 'HttpResponse' could be found (are you missing a using directive or an assembly reference?)

在Startup.cs中添加命名空間:

using Microsoft.AspNet.Http;

再次運行,成功!

$ dnx . kestrel
Started

瀏覽器訪問 http://localhost:8080/ ,得到正常的響應內容:

Hello, cnblogs!

通過這樣的試錯法,得到了運行一個最簡單的ASP.NET 5程序的最小配置:

一個文件夾,2個文件(project.json與Startup.cs)。

project.json文件中的內容:

{
    "commands": {
        "kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:8080"
    },
    "dependencies": {
        "Kestrel": "1.0.0-*"
    },
    "frameworks": {
         "dnxcore50": { }
    }
}

Startup.cs中的內容:

using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;

namespace HelloCnblogs
{
    public class Startup
    {
        public void Configure(IApplicationBuilder app)
        {
            app.Run(async context => await context.Response.WriteAsync("Hello, cnblogs!"));
        }    
    }
}

雖然是用最笨的方法寫了一個最簡單的程序,但是這么動手操作一次,感覺就是不一樣。


文章列表


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

    IT工程師數位筆記本

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