問題
怎麼樣將 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配置。
1GlobalConfiguration.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 30public
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 22public
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/