Ø 简介
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();