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 响应

clip_image002

JSON 响应

clip_image003

 

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 响应相同)

clip_image004

 

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();

 

posted @ 2022-03-26 20:58  Abeam  阅读(648)  评论(0编辑  收藏  举报