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

     

  • 相关阅读:
    LeetCode344
    LeetCode18四数之和扩展N数之和
    LeetCode383赎金信
    2018-2020创业总结
    LeetCode454四数相加
    普通dll项目添加WPF的Window对象
    WPF中RadioButton的数据绑定
    02 C# 文件压缩与解压
    WPF 使用附加属性声明 ICommand
    自定义WPF分页控件
  • 原文地址:https://www.cnblogs.com/abeam/p/16060842.html
Copyright © 2020-2023  润新知