亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

ASP.NET MVC API 接口驗證的示例代碼

2024-07-10 13:32:42
字體:
來源:轉載
供稿:網友

項目中有一個留言消息接口,接收其他系統的留言和展示留言,參考了網上的一些API驗證方法,發現使用通用權限管理系統提供的驗證方法最完美。

下面將實現的完整思路共享

1、WebApiConfig全局處理

/// <summary>  /// WebApiConfig   /// 路由基礎配置。  ///   ///   /// 修改記錄  ///   ///    2016.11.01 版本:2.0 宋彪 對日期格式進行統一處理。  ///    2016.10.30 版本:2.0 宋彪 解決json序列化時的循環引用問題。  ///    2016.10.28 版本:2.0 宋彪 回傳響應格式 $format 支持。  ///    2016.09.01 版本:1.0 宋彪  創建。  ///   /// 版本:1.0  ///   /// <author>  ///    <name>宋彪</name>  ///    <date>2016.09.01</date>  /// </author>   /// </summary>  public static class WebApiConfig  {    /// <summary>    /// 注冊全局配置服務    /// </summary>    /// <param name="config"></param>    public static void Register(HttpConfiguration config)    {      // Web API configuration and services      //強制https訪問      //config.Filters.Add(new ForceHttpsAttribute());      // 統一回傳格式      config.Filters.Add(new ApiResultAttribute());      // 發生異常時處理      config.Filters.Add(new ApiErrorHandleAttribute());      // ToKen身份驗證過濾器 更方便 不需要在這里了 具有改標簽的就會自動檢查      //config.Filters.Add(new ApiAuthFilterAttribute());      // 解決json序列化時的循環引用問題      config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;      //對日期格式進行統一處理      config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(      new IsoDateTimeConverter()      {        DateTimeFormat = "yyyy-MM-dd hh:mm:ss"      }      );      // Web API routes 路由      config.MapHttpAttributeRoutes();      config.Routes.MapHttpRoute(        name: "DefaultApi",        routeTemplate: "api/{controller}/{action}/{id}",        defaults: new { id = RouteParameter.Optional }      );      // 干掉XML序列化器      //config.Formatters.Remove(config.Formatters.XmlFormatter);      //在請求的Url加上 ?$format=xml,便可以指定響應格式      config.Formatters.XmlFormatter.AddQueryStringMapping("$format", "xml", "application/xml");      config.Formatters.JsonFormatter.AddQueryStringMapping("$format", "json", "application/json");    }  }

2、身份驗證過濾器

  using DotNet.Business;  using DotNet.Utilities;  using DotNet.Tracking.API.Common;  /// <summary>  /// ApiAuthFilterAttribute  /// 身份驗證過濾器,具有ApiAuthFilterAttribute標簽屬性的方法會自動檢查  ///   ///   /// 修改紀錄  ///   /// 2016-10-11 版本:1.0 SongBiao 創建文件。    ///   /// <author>  ///   <name>SongBiao</name>  ///   <date>2016-10-11</date>  /// </author>  /// </summary>  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]  public class ApiAuthFilterAttribute : AuthorizationFilterAttribute  {    /// <summary>    /// 未授權時的提示信息    /// </summary>    private const string UnauthorizedMessage = "請求未授權,拒絕訪問。";    /// <summary>    /// 權限進入    /// </summary>    /// <param name="actionContext"></param>    public override void OnAuthorization(HttpActionContext actionContext)    {      base.OnAuthorization(actionContext);      // 允許匿名訪問      if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Count > 0)       {        return;      }      string systemCode = APIOperateContext.Current.SystemCode;      string permissionCode = APIOperateContext.Current.PermissionCode;      string appKey = APIOperateContext.Current.AppKey;      string appSecret = APIOperateContext.Current.AppSecret;            if (string.IsNullOrWhiteSpace(appKey) || string.IsNullOrWhiteSpace(appSecret))      {        //未驗證(登錄)的用戶, 而且是非匿名訪問,則轉向登錄頁面         //actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);        //actionContext.Response.Content = new StringContent("<p>Unauthorized</p>", Encoding.UTF8, "text/html");        var response = actionContext.Response= actionContext.Response?? new HttpResponseMessage();        response.StatusCode = HttpStatusCode.Unauthorized;        BaseResult result = new BaseResult        {          Status = false,          StatusMessage = UnauthorizedMessage        };        response.Content = new StringContent(result.ToJson(), Encoding.UTF8, "application/json");      }      else      {        // 檢查 AppKey 和 AppSecret        BaseResult result = BaseServicesLicenseManager.CheckService(appKey, appSecret, false, 0, 0, systemCode, permissionCode);        if (!result.Status)        {          var response = actionContext.Response = actionContext.Response?? new HttpResponseMessage();          response.Content = new StringContent(result.ToJson(), Encoding.UTF8, "application/json");        }      }               }  }

3、統一回傳格式

  /// <summary>  /// ApiResultAttribute  /// 統一回傳格式  ///   /// 修改紀錄  ///   /// 2016-10-31 版本:1.0 宋彪 創建文件。  ///   /// <author>  ///   <name>宋彪</name>  ///   <date>2016-10-31</date>  /// </author>  /// </summary>  public class ApiResultAttribute : ActionFilterAttribute  {    /// <summary>    /// 重寫回傳的處理    /// </summary>    /// <param name="actionExecutedContext"></param>    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)    {      // 快件跟蹤接口傳的是format,不用走這里      if (actionExecutedContext.Request.Properties.ContainsKey("format"))      {        // 若發生例外則不在這邊處理 在異常中處理 ApiErrorHandleAttribute        if (actionExecutedContext.Exception != null)          return;        base.OnActionExecuted(actionExecutedContext);        var result = new ApiResultModel();        // 取得由 API 返回的狀態碼        result.Status = actionExecutedContext.ActionContext.Response.StatusCode;        // 取得由 API 返回的資料        result.Data = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>().Result;        // 重新封裝回傳格式        actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(result.Status, result);      }    }  }

4、全局異常處理

  using DotNet.Utilities;  using DotNet.Tracking.API.Common;  using DotNet.Tracking.API.Controllers;  using DotNet.Tracking.API.Models;  /// <summary>  /// ApiErrorHandleAttribute  /// 全局異常處理  ///   /// 修改紀錄  ///   /// 2016-10-31 版本:1.0 宋彪 創建文件。  ///   /// <author>  ///   <name>宋彪</name>  ///   <date>2016-10-31</date>  /// </author>  /// </summary>  public class ApiErrorHandleAttribute : System.Web.Http.Filters.ExceptionFilterAttribute  {    /// <summary>    /// 異常統一處理    /// </summary>    /// <param name="actionExecutedContext"></param>    public override void OnException(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)    {      base.OnException(actionExecutedContext);      // 取得發生例外時的錯誤訊息      var errorMessage = actionExecutedContext.Exception.Message;      // 異常記錄      string parameters = APIOperateContext.GetRequestParameters();      NLogHelper.Trace(actionExecutedContext.Exception, BaseSystemInfo.SystemCode + " ApiErrorHandleAttribute OnException 完整的請求地址及參數 : " + parameters);      // 2016-11-01 加入異常郵件提醒      NLogHelper.InfoMail(actionExecutedContext.Exception, BaseSystemInfo.SystemCode + " ApiErrorHandleAttribute OnException 完整的請求地址及參數 : " + parameters);      var result = new ApiResultModel()      {        Status = HttpStatusCode.BadRequest,        ErrorMessage = errorMessage      };      // 重新打包回傳的訊息      actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(result.Status, result);    }  }

5、接口操作的上下文

  using DotNet.Business;  using DotNet.Model;  using DotNet.Utilities;  /// <summary>  /// APIOperateContext  /// 接口操作的上下文  /// 跟上下文有關的一些通用的東西放在這里處理  ///   /// 修改紀錄  ///   /// 2016-10-31 版本:1.0 宋彪 創建文件。  ///   /// <author>  ///   <name>宋彪</name>  ///   <date>2016-10-31</date>  /// </author>  /// </summary>  public class APIOperateContext  {    /// <summary>    /// 獲取當前 操作上下文 (為每個處理瀏覽器請求的服務器線程 單獨創建 操作上下文)    /// </summary>    public static APIOperateContext Current    {      get      {        APIOperateContext oContext = CallContext.GetData(typeof(APIOperateContext).Name) as APIOperateContext;        if (oContext == null)        {          oContext = new APIOperateContext();          CallContext.SetData(typeof(APIOperateContext).Name, oContext);        }        return oContext;      }    }    #region Http上下文 及 相關屬性    /// <summary>    /// Http上下文    /// </summary>    public HttpContext ContextHttp    {      get      {        return HttpContext.Current;      }    }    /// <summary>    /// 輸出對象    /// </summary>    public HttpResponse Response    {      get      {        return ContextHttp.Response;      }    }    /// <summary>    /// 請求對象    /// </summary>    public HttpRequest Request    {      get      {        return ContextHttp.Request;      }    }    /// <summary>    /// Session對象    /// </summary>    System.Web.SessionState.HttpSessionState Session    {      get      {        return ContextHttp.Session;      }    }    #endregion    /// <summary>    /// 獲取全部請求參數,get和post的 簡化版    /// </summary>    public static string GetRequestParameters()    {      string query = HttpContext.Current.Request.Url.Query;      NameValueCollection nvc;      string baseUrl;      ParseUrl(query, out baseUrl, out nvc);      List<string> list = new List<string>() { };      foreach (var key in nvc.AllKeys)      {        list.Add(key + "=" + nvc[key]);      }      var form = HttpContext.Current.Request.Form;      foreach (var key in form.AllKeys)      {        list.Add(key + "=" + form[key]);      }      string result = HttpContext.Current.Request.Url.AbsoluteUri + "?" + string.Join("&", list);      return result;    }    /// <summary>    /// 分析 url 字符串中的參數信息    /// 針對get請求的    /// </summary>    /// <param name="url">輸入的 URL</param>    /// <param name="baseUrl">輸出 URL 的基礎部分</param>    /// <param name="nvc">輸出分析后得到的 (參數名,參數值) 的集合</param>    public static void ParseUrl(string url, out string baseUrl, out NameValueCollection nvc)    {      if (url == null)      {        throw new ArgumentNullException("url");      }      nvc = new NameValueCollection();      baseUrl = "";      if (url == "")      {        return;      }      int questionMarkIndex = url.IndexOf('?');      if (questionMarkIndex == -1)      {        baseUrl = url;        return;      }      baseUrl = url.Substring(0, questionMarkIndex);      if (questionMarkIndex == url.Length - 1)      {        return;      }      string ps = url.Substring(questionMarkIndex + 1);      // 開始分析參數對       Regex re = new Regex(@"(^|&)?(/w+)=([^&]+)(&|$)?", RegexOptions.Compiled);      MatchCollection mc = re.Matches(ps);      foreach (Match m in mc)      {        nvc.Add(m.Result("$2").ToLower(), m.Result("$3"));      }    }    /// <summary>    /// 系統編號    /// </summary>    public string SystemCode    {      get      {        return Request["systemCode"] ?? "Base";      }    }    /// <summary>    /// 權限編號    /// </summary>    public string PermissionCode    {      get      {        return Request["permissionCode"];      }    }    /// <summary>    /// 訪問接口的應用傳來AppKey    /// </summary>    public string AppKey    {      get      {        return Request["appKey"];      }    }    /// <summary>    /// 訪問接口的應用傳來AppSecret    /// </summary>    public string AppSecret    {      get      {        return Request["appSecret"];      }    }    private BaseUserInfo _userInfo = null;    /// <summary>    /// 獲取當前用戶    /// 通過接口AppKey和AppSecret獲取的用戶    /// </summary>    /// <returns></returns>    public BaseUserInfo UserInfo    {      get      {        BaseUserInfo userInfo = null;        BaseUserEntity userEntity = BaseUserManager.GetObjectByCodeByCache(AppKey);        if (userEntity != null)        {          if (BaseServicesLicenseManager.CheckServiceByCache(userEntity.Id, AppSecret))          {            userInfo = new BaseUserInfo();            userInfo.Id = userEntity.Id;            userInfo.RealName = userEntity.RealName;            userInfo.UserName = userEntity.UserName;            userInfo.IPAddress = Utilities.GetIPAddress(true);          }        }        return userInfo;      }    }    #region 業務庫連接    /// <summary>    /// 業務庫連接    /// </summary>    public static IDbHelper BusinessDbHelper    {      get      {        return DbHelperFactory.GetHelper(BaseSystemInfo.BusinessDbType, BaseSystemInfo.BusinessDbConnection);      }    }    #endregion    #region 用戶中心庫連接    /// <summary>    /// 用戶中心庫連接    /// </summary>    public static IDbHelper UserCenterDbHelper    {      get      {        return DbHelperFactory.GetHelper(BaseSystemInfo.UserCenterDbType, BaseSystemInfo.UserCenterDbConnection);      }    }    #endregion  }

7、統一回傳格式實體

  /// <summary>  /// ApiResultModel  /// 統一回傳格式實體  ///   /// 修改紀錄  ///   /// 2016-10-31 版本:1.0 宋彪 創建文件。  ///   /// <author>  ///   <name>宋彪</name>  ///   <date>2016-10-31</date>  /// </author>  /// </summary>  public class ApiResultModel  {    public HttpStatusCode Status { get; set; }    //public JsonResult<T> Data { get; set; }    public object Data { get; set; }    public string ErrorMessage { get; set; }  }

8、留言相關接口

  /// <summary>  /// MessageBookController  /// 留言相關接口  ///   /// 修改紀錄  ///   /// 2016-10-31 版本:1.0 宋彪 創建文件。  ///   /// <author>  ///   <name>宋彪</name>  ///   <date>2016-10-31</date>  /// </author>  /// </summary>  [ApiAuthFilter]  public class CustomerMessageController : ApiController  {    /// <summary>    /// 保存單號留言信息    /// </summary>    /// <param name="messageBook"></param>    /// <returns></returns>    [HttpPost]    //[AllowAnonymous] 不需要驗證的就加這個標簽    public IHttpActionResult Add([FromBody]MsgbookCusEntity messageBook)    {      BaseResult baseResult = new BaseResult();      if (string.IsNullOrWhiteSpace(messageBook.SystemFrom))      {        baseResult.Status = false;        baseResult.StatusMessage = "SystemFrom參數不可為空";      }      else      {        try        {          MsgbookCusManager manager = new MsgbookCusManager(APIOperateContext.BusinessDbHelper, APIOperateContext.Current.UserInfo);          MsgbookCusEntity model = new MsgbookCusEntity();          model.Id = Guid.NewGuid().ToString("N");          model.Message = messageBook.Message;          model.SendEmail = messageBook.SendEmail;          model.SendTelephone = messageBook.SendTelephone;          model.Message = messageBook.Message;          model.BillCode = messageBook.BillCode;          model.SystemFrom = messageBook.SystemFrom;          model.DeletionStateCode = 0;          manager.Add(model, false, false);          baseResult.Status = true;          baseResult.StatusMessage = "添加成功。";        }        catch (Exception ex)        {          NLogHelper.Warn(ex, "CustomerMessageController AddBillMessage 異常");          baseResult.Status = false;          baseResult.StatusMessage = "異常:" + ex.Message;        }      }      return Ok(baseResult);    }    /// <summary>    /// 獲取某個單號的留言    /// </summary>    /// <param name="billCode"></param>    /// <returns></returns>    [HttpGet]    public IHttpActionResult GetList(string billCode)    {      JsonResult<List<MsgbookCusEntity>> jsonResult = new JsonResult<List<MsgbookCusEntity>>();      try      {        MsgbookCusManager manager = new MsgbookCusManager(APIOperateContext.BusinessDbHelper, APIOperateContext.Current.UserInfo);        List<MsgbookCusEntity> list = new List<MsgbookCusEntity>();        list = manager.GetList<MsgbookCusEntity>(new KeyValuePair<string, object>(MsgbookCusEntity.FieldBillCode, billCode)        , new KeyValuePair<string, object>(MsgbookCusEntity.FieldDeletionStateCode, 0));        jsonResult.Status = true;        jsonResult.RecordCount = list.Count;        jsonResult.Data = list;        jsonResult.StatusMessage = "獲取成功";      }      catch (Exception ex)      {        NLogHelper.Warn(ex, "CustomerMessageController AddBillMessage 異常");        jsonResult.Status = false;        jsonResult.StatusMessage = "異常:" + ex.Message;      }      return Ok(jsonResult);    }  }

9、接口調用方法

    /// <summary>    /// 測試留言接口調用    /// </summary>    /// <returns></returns>    public ActionResult AddCustomerMessage()    {      string url = "http://192.168.1.88:808/api/CustomerMessage/Add?";      WebClient webClient = new WebClient();      NameValueCollection postValues = new NameValueCollection();      postValues.Add("Message", "填寫您的留言內容吧");      postValues.Add("SendEmail", "youemail@qq.com");      postValues.Add("SendTelephone", "021-60375335");      postValues.Add("Code", "661137858");      postValues.Add("AppKey", "wssavbcn");      postValues.Add("AppSecret", "350e66b1e6564b0a817163erwwwwe8");      postValues.Add("SystemFrom", "官網");      byte[] responseArray = webClient.UploadValues(url, postValues);      string response = Encoding.UTF8.GetString(responseArray);      return Content(response);    }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲香蕉成人av网站在线观看| 国产成人精品日本亚洲专区61| 91国产在线精品| 国产成人午夜视频网址| 欧美国产日韩一区二区三区| 亚洲欧美中文在线视频| 日本一本a高清免费不卡| 在线播放日韩欧美| 国产91久久婷婷一区二区| 精品av在线播放| 亚洲高清久久网| 国产91色在线|免| 欧美乱大交xxxxx另类电影| 欧美刺激性大交免费视频| 国产一区二区三区高清在线观看| 91美女片黄在线观看游戏| 精品国产欧美一区二区三区成人| 欧美激情视频网| 亚洲精品一区久久久久久| 91精品久久久久久久久中文字幕| 日韩av电影免费观看高清| 久久影视三级福利片| 激情av一区二区| 欧美日韩国产一区二区| 欧美成人第一页| 亚洲一区二区日本| 日韩欧美福利视频| 青草青草久热精品视频在线观看| 精品国产福利视频| 久久精品国产视频| 色综合久久久久久中文网| xvideos亚洲人网站| 国产精品久久久久久久久久尿| 久久成人18免费网站| 欧美激情网站在线观看| 国产精品自拍小视频| 久久九九免费视频| 91久久夜色精品国产网站| 国产精品久久97| 亚洲男人天天操| 2021久久精品国产99国产精品| 久久影视电视剧免费网站清宫辞电视| 亚洲美女免费精品视频在线观看| 久久亚洲精品成人| 国产成人中文字幕| 色偷偷偷亚洲综合网另类| 亚洲国产精品va在线看黑人动漫| 亚洲精品自拍第一页| 亚洲视频在线看| 成人黄色激情网| 成人黄色大片在线免费观看| 国产欧美中文字幕| 庆余年2免费日韩剧观看大牛| 北条麻妃一区二区三区中文字幕| 91精品综合视频| 日韩成人在线视频| 一区二区欧美激情| 韩剧1988在线观看免费完整版| 97视频在线观看亚洲| 久久天天躁夜夜躁狠狠躁2022| 欧美二区在线播放| 色综合久综合久久综合久鬼88| 一本色道久久综合狠狠躁篇的优点| 国产精品久久久久久久久| 亚洲韩国日本中文字幕| 久国内精品在线| 欧美性猛交xxxx久久久| 日韩精品极品在线观看播放免费视频| 中文字幕在线精品| 超碰精品一区二区三区乱码| 日韩成人在线视频观看| 欧美日本啪啪无遮挡网站| 欧美电影在线观看| 欧美一区二区三区四区在线| 精品亚洲va在线va天堂资源站| 亚洲人成77777在线观看网| 久久久久中文字幕| 亚洲精品国偷自产在线99热| 成人精品久久久| 国产欧美一区二区三区久久人妖| 成人午夜高潮视频| 久久人人爽人人爽人人片亚洲| 欧美精品久久久久久久久| 亚洲一区美女视频在线观看免费| 国产人妖伪娘一区91| 在线日韩av观看| 日韩在线中文视频| 操91在线视频| 3344国产精品免费看| 亚洲欧美国产精品| 亚洲va码欧洲m码| 亚洲女人天堂色在线7777| www国产91| 久久av红桃一区二区小说| 亚洲精品福利在线观看| 91网站在线免费观看| 国产精品久久久久久久久久久久久| 欧美激情精品久久久久久| 人妖精品videosex性欧美| 最好看的2019的中文字幕视频| 欧美成人精品一区二区| 亚洲欧美激情四射在线日| 亚洲欧美日韩第一区| 91av网站在线播放| 日韩有码在线观看| 国产亚洲精品综合一区91| 国产欧美日韩高清| 亚洲国产精品成人va在线观看| 国产在线播放91| 久久香蕉国产线看观看网| 亚洲一区二区三区香蕉| 国内外成人免费激情在线视频网站| 国精产品一区一区三区有限在线| 91精品国产自产91精品| 成人自拍性视频| 国产精品成人av在线| 成人性生交大片免费看视频直播| 久久亚洲综合国产精品99麻豆精品福利| 日韩精品在线视频观看| 亚洲偷欧美偷国内偷| 欧美黑人巨大xxx极品| 国产精品美女久久久久久免费| 91成人性视频| 精品中文字幕在线观看| 黑人极品videos精品欧美裸| 国产日韩精品电影| 国产日韩换脸av一区在线观看| 国产午夜精品理论片a级探花| 福利微拍一区二区| 亚洲偷熟乱区亚洲香蕉av| 久久综合五月天| 欧美影院久久久| www.亚洲天堂| 欧美电影免费观看网站| 欧美成人四级hd版| 欧洲精品久久久| 欧美性生交xxxxxdddd| 久久久久久九九九| 538国产精品一区二区免费视频| 欧美激情视频网址| 永久免费毛片在线播放不卡| 91久久精品日日躁夜夜躁国产| 国产日韩精品电影| 91精品在线观| 在线精品91av| 黄色一区二区三区| 亚洲老司机av| 欧美成年人视频网站欧美| 欧美激情一区二区三区高清视频| 欧美激情欧美激情| 国产精品日韩精品| 黑人巨大精品欧美一区二区一视频| 欧美极品少妇全裸体| 美女撒尿一区二区三区| 欧美色道久久88综合亚洲精品| 91精品久久久久久久久久久| 国产精品欧美激情| 国产午夜精品免费一区二区三区| 精品av在线播放| 欧美日韩国产在线播放| 最新69国产成人精品视频免费| 欧美性猛交xxxx乱大交蜜桃| 日韩在线视频国产| 亚洲一区二区三区香蕉|