今天坐高鐵時嘗試了一種學習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!")); } } }
雖然是用最笨的方法寫了一個最簡單的程序,但是這么動手操作一次,感覺就是不一樣。
文章列表