C# 在进行WEB Api验证时重复代码

C# 在进行WEB Api验证时重复代码,c#,.net,C#,.net,我对WEB API中的每个方法都进行了一些检查,检查来自头部的令牌,以匹配数据库中的记录。我需要对每个WEB API方法使用此验证。在这种情况下,对于每个方法,我需要复制/粘贴同一段代码。如何重新设计方法以避免代码重复 下面是两个方法的示例,它们在begging时具有相同的代码段 [HttpPost] [Route("QRCConnect")] public async Task<IHttpActionResult> QRCConnect([Required]string userI

我对WEB API中的每个方法都进行了一些检查,检查来自头部的令牌,以匹配数据库中的记录。我需要对每个WEB API方法使用此验证。在这种情况下,对于每个方法,我需要复制/粘贴同一段代码。如何重新设计方法以避免代码重复

下面是两个方法的示例,它们在begging时具有相同的代码段

[HttpPost]
[Route("QRCConnect")]
public async Task<IHttpActionResult> QRCConnect([Required]string userId, [Required]int eventId, [Required]int supplierId)
{
    try
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        var token = GetTokenFromHeader(Request.Headers);
        var api = await _webApiService.GetApiByToken(token).ConfigureAwait(false);
        if (api == null)
        {
            return Ok(GenerateErrorsModel(404, TokenNotFoundMessage));
        }

        if (api.IsExpired)
        {
            return Ok(GenerateErrorsModel(400, TokenExpiredMessage));
        }
        ...

[HttpGet]
[Route("GetBuyerInfo")]
public async Task<IHttpActionResult> GetBuyerInfo(string userId)
{
    try
    {
        var token = GetTokenFromHeader(Request.Headers);
        var api = await _webApiService.GetApiByToken(token).ConfigureAwait(false);
        if (api == null)
        {
            return Ok(GenerateErrorsModel(404, TokenNotFoundMessage));
        }

        if (api.IsExpired)
        {
            return Ok(GenerateErrorsModel(400, TokenExpiredMessage));
        }
        ...
[HttpPost]
[路线(“QRCConnect”)]
公共异步任务QRCConnect([必需]字符串用户ID,[必需]int-eventId,[必需]int-supplierId)
{
尝试
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
var token=GetTokenFromHeader(Request.Headers);
var api=await\u webApiService.GetApiByToken(token.ConfigureAwait(false);
如果(api==null)
{
返回Ok(GenerateErrorsModel(404,TokenNotFoundMessage));
}
如果(api.IsExpired)
{
返回Ok(GenerateErrorsModel(400,TokenExpiredMessage));
}
...
[HttpGet]
[路线(“GetBuyerInfo”)]
公共异步任务GetBuyerInfo(字符串用户ID)
{
尝试
{
var token=GetTokenFromHeader(Request.Headers);
var api=await\u webApiService.GetApiByToken(token.ConfigureAwait(false);
如果(api==null)
{
返回Ok(GenerateErrorsModel(404,TokenNotFoundMessage));
}
如果(api.IsExpired)
{
返回Ok(GenerateErrorsModel(400,TokenExpiredMessage));
}
...

您可以为所有控制器创建一个基类,并将公共代码移到该基类中。例如

public class BaseController
{
     protected bool ValidateApiResult(ApiResult api,out IHttpActionResult result)
     {
         if(api == null)
         {
              result  = Ok(GenerateErrorsModel(404, TokenNotFoundMessage));
              return false;
         }

         if (api.IsExpired)
         {
              result  = Ok(GenerateErrorsModel(400, TokenExpiredMessage));
              return false;
         }
         result = default;
         return true;
     } 
}
现在,在其余的控制器中,您可以使用

var api = await _webApiService.GetApiByToken(token).ConfigureAwait(false);
if(!base.ValidateApiResult(api,var out result))
{
   return result;
}

您可以为所有控制器创建一个基类,并将公共代码移到该基类中。例如

public class BaseController
{
     protected bool ValidateApiResult(ApiResult api,out IHttpActionResult result)
     {
         if(api == null)
         {
              result  = Ok(GenerateErrorsModel(404, TokenNotFoundMessage));
              return false;
         }

         if (api.IsExpired)
         {
              result  = Ok(GenerateErrorsModel(400, TokenExpiredMessage));
              return false;
         }
         result = default;
         return true;
     } 
}
现在,在其余的控制器中,您可以使用

var api = await _webApiService.GetApiByToken(token).ConfigureAwait(false);
if(!base.ValidateApiResult(api,var out result))
{
   return result;
}

你能把它放在扩展方法中吗?看看这个:;-)你能把它放在扩展方法中吗?看看这个:;-)