問題 怎麼樣將 Asp.Net Web Api 加入到 Asp.Net Web From 應用程式中 解決方案 在 Visual Studio 2013 中,創建新的 Web From,可以直接在"新建 ASP.NET 項目" 創建項目嚮導中,勾選ASP.NET Web API ,將其加入進來。如圖 ...
問題
怎麼樣將 Asp.Net Web Api 加入到 Asp.Net Web From 應用程式中
解決方案
在 Visual Studio 2013 中,創建新的 Web From,可以直接在"新建 ASP.NET 項目" 創建項目嚮導中,勾選ASP.NET Web API ,將其加入進來。如圖 1-2 所示。
圖 1-2. 在Asp.NET 項目嚮導,同時選中 Web Form 和 Web API
因為可以通過 NuGet 添加 ASP.NET Web API ,所以使用“Install-Package Microsoft.AspNet.WebApi”就可以輕易將其添加到現有的 Web Form 解決方案中。
在 Visual Studio 2012 中使用也很簡單,只要創建一個 WebForm 項目,然後通過NuGet 來安裝 Web API 就可以。
工作原理
和在 MVC 中使用 ASP.NET Web API 一樣,在 Web Form 項目中ASP.NET Web API 使用 的結果就是,Web API和 Web Form 應用程式運行在同一個 ASP.NET 進程中。
在 ASP.NET 項目中安裝 Microsoft.AspNet.WebApi NuGet 包時,會在 App_Start文件夾中添加 WebApiConfig 的 靜態類。這個文件是用來配置 ASP.NET Web API 和定義 ASP.NET Web API 路由。
另外,在 Global.asax 中的 Application_Start 可以找到被添加的代碼,就像下麵的代碼片段,調用 Web API配置。
1 |
GlobalConfiguration.Configure(WebApiConfig.Register);
|
Web API 運行在 Web Form 應用程式中與 運行在 MVC 應用程式中沒什麼不同。每個請求仍將被相關的IHttpHandler 處理。可能是用於處理 Web API 的 HttpControllerHandler 或者是用於處理 Web Form 的處理器。Web Form 相關的 ASPX 擴展名會交給 PageHandlerFactory,依次調用相關的 IHttpHandler 來處理 HTTP請求。System.Web.UI.Page 類是 Web Form 應用程式的預設組成部分,也是一個 IHttpHandler,其實他才是請求處理器的真正執行者。
代碼演示
清單 1-5 展示了一個簡單的模型類,這個模型是ApiController 和 Web Form 頁展示數據的共用類。
清單 1-5. 簡單模型,Web Form 頁,和 Web API 控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public class Book{
public int Id { get ; set ; }
public string Author { get ; set ; }
public string Title { get ; set ; }
} public partial class _Default : Page{
protected void Page_Load( object sender, EventArgs e)
{
int id;
if (Int32.TryParse(( string )Page.RouteData.Values[ "id" ], out id))
{
var book = Books.List.FirstOrDefault(x => x.Id == id);
if (book == null )
{
Response.StatusCode = 404;
return ;
}
ltlAuthor.Text = book.Author;
ltlTitle.Text = book.Title;
hplLink.NavigateUrl = "/api/books/" + book.Id;
}
Response.StatusCode = 404;
}
} public class BooksController : ApiController{
public Book GetById( int id)
{
var book = Books.List.FirstOrDefault(x => x.Id == id);
if (book == null ) throw new HttpResponseException(HttpStatusCode.NotFound);
return book;
}
}
|
這是一個約定,在解決方案的 Cotrollers 文件夾中放 ApiController,但是,這並不意味著這是強制要求;在當前應用程式中,只要被聲明為 public 的類,類名以Controller 為尾碼的 IHttpController 實現類,都會被運行時發現,也會被當成一個可以處理的 HTTP 請求。
就像 Web API 和 MVC 一塊兒運行一樣,當使用 Web Form 路由,我們也必須留心那些要被 Web API 處理的路由和那些要導向 ASPX 頁面之間引起的衝突。列表 1-6 展示了 Web Form 和 Web API的簡單路由設置。ASP.NET Web API 路由是在 WebApiConfig 的靜態類中設置的,然而,Web Form 路由是在RouteConfig 靜態類中設置的。
列表 1-6. Web API 路由和 Web Form 路由
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public static class RouteConfig{
public static void RegisterRoutes(RouteCollection routes)
{
var settings = new FriendlyUrlSettings();
settings.AutoRedirectMode = RedirectMode.Permanent;
routes.EnableFriendlyUrls(settings);
routes.MapPageRoute(
"book-route" ,
"book/{id}" ,
"~/default.aspx" );
}
} public static class WebApiConfig{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services // Web API routes config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi" ,
routeTemplate: "api/{controller}/{id}" ,
defaults: new { id = RouteParameter.Optional }
);
}
}
|
博客園:http://www.cnblogs.com/shuizhucode/
51 CTO:http://shuizhucode.blog.51cto.com/