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
預設情況下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.
{
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();