[C#][ASP.NET] 如何在 .NET Framework 4.0 加入 Web Api

这篇是写给想要在旧专案偷渡 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

http://img2.58codes.com/2024/20106865k3DwoT61z7.jpg

不过这样有个缺点,因为比起 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

http://img2.58codes.com/2024/201068655dtJ53ef9X.jpg

/DotNetFramework4/api/Test/getItem

http://img2.58codes.com/2024/20106865DhMK5XTTPu.jpg


因为 Web Api 是无状态的,所以程式中如果有使用到 Session 会出错。

[HttpGet][ActionName("getSession")]public object GetSession(){    var httpContext = HttpContext.Current;    httpContext.Session["test"] = "hellow";    return httpContext.Session["test"];}

找不到 Session 执行个体。

http://img2.58codes.com/2024/20106865etgYhzbkhq.jpg

开启 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);    }}

结果

http://img2.58codes.com/2024/201068651EjmFLtYGP.jpg


补充

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


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章