这篇是写给想要在旧专案偷渡 Web Api 的朋友看的。 (́◕◞౪◟◕‵)*
之前也写过类似的文章 [C#][ASP.NET] Web API 开发心得 (1) - WebForm 搭配 Web API
不过很遗憾 .NET Framework 4.0 无法使用 Web Api 2,因此才会有这篇的出现,这篇会介绍如何在 4.0 的环境加入初代 Web Api,虽然功能没有之后的版本强大,不过总比什么都没有好 ~~~
1. 安装的套件 (Nuget)
Microsoft.AspNet.WebApi - 4.0.30506要注意版本,太新不能安装。
2. 开启 Global.asax 在 Application_Start 加入路由设定
public partial class Global : HttpApplication{ void Application_Start(object sender, EventArgs e) { var config = GlobalConfiguration.Configuration; config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
3. 因为 api 预设会回传 xml 如果想改成 json 可以加入以下程式
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional });//移除 XML Formattervar appXmlType =config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefaul(t => t.MediaType == "application/xml");config.Formatters.XmlFormatter.SupportedMediaTypes.Remov(appXmlType);//JSON 缩排config.Formatters.JsonFormatter.SerializerSettings.Formatting =Newtonsoft.Json.Formatting.Indented;
4. 新增 TestController.cs 档案必需放在 App_Code 资料夹内
public class TestController : ApiController{ public object Get() { return new { s = "Hi~Hi~" }; }}
结果
/DotNetFramework4/api/Test
不过这样有个缺点,因为比起 MVC 的路由少了一层 Action,因此必需透过 http method
决定要执行的方法,使用起来不太方便,所以开始研究有没有其他设定方式。
翻了微软文件,虽然不能像 Web Api 2 一样完全自订路由,但有几个 Attribute 加入后应该还是不错的。
1. 调整路由设定加入 {action}
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional });
2. 在程式内加入 [HttpGet] 和 [ActionName("xxx")] 这两个 Attribute 控制路由
更多用法可以参考微软文件: ASP.NET Web API 中的路由
public class TestController : ApiController{ [HttpGet] [ActionName("getList")] public object GetList() { return new List<string> { "123", "456" }; } [HttpGet] [ActionName("getItem")] public object GetItem() { return "abc"; }}
结果
/DotNetFramework4/api/Test/getList
/DotNetFramework4/api/Test/getItem
因为 Web Api 是无状态的,所以程式中如果有使用到 Session 会出错。
[HttpGet][ActionName("getSession")]public object GetSession(){ var httpContext = HttpContext.Current; httpContext.Session["test"] = "hellow"; return httpContext.Session["test"];}
找不到 Session 执行个体。
开启 Global.asax 在 Application_PostAuthorizeRequest 加入以下程式
判断网址开头如果是 api
,设定 SessionStateBehavior.Required,这样就可以在 Controller 内使用 Session。
private bool IsWebApiRequest(){ return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith("~/api");}void Application_PostAuthorizeRequest(){ if (IsWebApiRequest()) { HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required); }}
结果
补充
Global.asax 有两种写法。
第一种
程式码和标籤写在一起。
Global.asax
<%@ Application Language="C#" %><script runat="server"> void Application_Start(object sender, EventArgs e) { ... }</script>
第二种
程式码和标籤分开档案,又称为 Code Behind。
Global.asax
<%@ Application Language="C#" Inherits="AppsCore.Global" %>
Global.asax.cs 档案放在 App_Code
namespace AppsCore{ public partial class Global : HttpApplication { void Application_Start(object sender, EventArgs e) { ... } }}
如何在第一种写法,引用 System.Web.Http
?
可以使用 Import
标籤,如下:
<%@ Import Namespace="System.Web.Http" %>
完整程式:
<%@ Application Language="C#" %><%@ Import Namespace="System.Web.Http" %><script runat="server"> void Application_Start(object sender, EventArgs e) { var config = GlobalConfiguration.Configuration; config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = System.Web.Http.RouteParameter.Optional } ); }</script>
结语
这篇就到这里,感谢大家观看,祝大家偷渡愉快。 \(★´▽`)人(´▽`★)/
参考文章
[Web API]在VS2010 .Net Framework 4.0 环境下使用Web API 1
HttpConfiguration missing assembly
ASP.NET Web API 中的路由
Accessing Session Using ASP.NET Web API