1. 程式人生 > 其它 >ASP.NET Web API 2 常用開發技術

ASP.NET Web API 2 常用開發技術

Ø  簡介

ASP.NET Web API 應該是一個 C# 開發人員經常接觸,必不可少的開發技術之一了,當然現在還有更流行的開發框架,就是開源、跨平臺框架 ASP.NET Core。本文只針對 .NET Framework 下的 ASP.NET Web API 開發技術進行總結,包括以下內容:

1.  Web API 開啟Session 物件

2.  指定日期型別格式化響應

3.  獲取請求網路IP

4.  JWT的缺點

5.  會話級身份標識物件的使用

6.  Web API 配置快取輸出

7.  媒體型別格式化導致響應失敗

 

1.  Web API

開啟Session 物件

預設情況下Web API 是未開啟Session 的,需要進行設定後才能使用,實現的方法有幾種,下面是一種比較簡單的方法,在 Global.asax 中新增程式碼:

public override void Init()

{

    base.PostAuthenticateRequest += (sender, e) =>

    {

System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);

    };

    base.Init();

}

 

2.  指定日期型別格式化響應

1)  首先,來看一下預設的響應格式

XML 響應

JSON 響應

 

2)   Web API 1.0 中都已經將 Newtonsoft.Json (第三方類庫)整合進來,所以可以使用以下程式碼進行格式設定,在 WebApiConfig 中加入程式碼:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.

IsoDateTimeConverter()

{

    DateTimeFormat = "yyyy-MM-dd HH:mm:ss fff"

});

再次請求,JSON 響應(XML 響應相同)

 

3.  獲取請求網路IP

可以採用以下兩種方法:

1)  第一種方法,對 HttpRequestMessage 新增擴充套件方法(使用更方便)

using System.Net.Http;

public static class HttpRequestMessageExtensions

{

    private const string HttpContext = "MS_HttpContext";

    private const string RemoteEndpointMessage =

        "System.ServiceModel.Channels.RemoteEndpointMessageProperty";

    private const string OwinContext = "MS_OwinContext";

 

    public static string GetClientIpAddress(this HttpRequestMessage request)

    {

        // Web-hosting. Needs reference to System.Web.dll

        if (request.Properties.ContainsKey(HttpContext))

        {

            dynamic ctx = request.Properties[HttpContext];

            if (ctx != null)

            {

                return ctx.Request.UserHostAddress;

            }

        }

        // Self-hosting. Needs reference to System.ServiceModel.dll.

        if (request.Properties.ContainsKey(RemoteEndpointMessage))

        {

            dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage];

            if (remoteEndpoint != null)

            {

                return remoteEndpoint.Address;

            }

        }

        // Self-hosting using Owin. Needs reference to Microsoft.Owin.dll.

        if (request.Properties.ContainsKey(OwinContext))

        {

            dynamic owinContext = request.Properties[OwinContext];

            if (owinContext != null)

            {

                return owinContext.Request.RemoteIpAddress;

            }

        }

        return null;

}

 

2)  第二種方法

string clientIp = ((HttpContextWrapper)Request.Properties["MS_HttpContext"]).Request.UserHostAddress;

說明:其中 Request 物件為HttpRequestMessage 的例項,其實也是第一種方法的另一種寫法。

 

4.  JWT的缺點

1)  不能很好控制失效時間,可以藉助 Redis 這種高效快取方案;

2)  不能很好獲取當前使用者資訊

更多參考:https://www.jianshu.com/p/0c4a3688d298

 

5.  會話級身份標識物件的使用

會話級身份標識物件可自定義,以下三種方式都可以使用,區別如下:

1)   System.Web.HttpContext.Current.User:當前會話中的全域性引用

2)   RequestContext.Principal:在當前Controller 中可呼叫

3)  System.Threading.Thread.CurrentPrincipal:當前執行緒中可呼叫

Ø  注意:HttpContext.Current.User RequestContext.Principal 是同一個變數,三者原始都為同一個引用,但修改HttpContext.Current.User 後,Thread.CurrentPrincipal 不會隨之改變。

 

6.  Web API 配置快取輸出

[OutputCache(Duration = 600, VaryByParam = "none")]         --MVC

[CacheOutput(ClientTimeSpan = 2000, ServerTimeSpan = 2000)]--WEBAPI

 

7.  媒體型別格式化導致響應失敗

瀏覽器請求接口出錯,例如:http://localhost:58977/ids/sys/startup

Ø  錯誤描述:“ObjectContent`1”型別未能序列化內容型別“application/xml; charset=utf-8”的響應正文。

Ø  解決辦法:在WebApiConfig.Register() 方法中加入配置:GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();