asp.net-web-api
Skapa en anpassad åtgärdFilterAttribut
Sök…
Introduktion
Handlingsfilterattribut är en del av ASP .NET-ramverket som jag tycker är användbart för att följa DRY-principen. Du kan ersätta flera rader med gemensam logik med en enkel deklarativ tagg. Ramverket tillhandahåller flera användbara åtgärdsfilterattribut som standard, till exempel autorisera och hantera felattribut. Den här guiden är avsedd att visa dig hur du skapar ditt eget anpassade attribut.
EnsurePresenseOfAttribute
Detta är ett exempel på ett attribut som jag skapade för att validera att nödvändiga parametrar har tilldelats i förfrågningsobjektet som tas emot på en POST-rutt. Jag bestämde mig för den här metoden eftersom standard ModelState.IsValid- metoden inte var giltig. Detta beror på att de nödvändiga attributen varierar baserat på vilken åtgärd som kallas.
// ATTRIBUTE ENDAST GODT FÖR METODER [AttributeUsage (AttributeTargets.Method)] // INHERIT ActionFilterAttribute public class EnsurePresencesOfAttribute: ActionFilterAttribute {// ReSharper inaktivera när InconsistentNaming public string required {get; uppsättning; }
// VALIDATE REQUIRED ATTRIBUTES
// FOR NON-ASYNC REQUESTS
public override void OnActionExecuting(HttpActionContext context)
{
Dictionary<string, object> model = context.ActionArguments;
var serialstring = JsonConvert.SerializeObject(model);
foreach (var requirement in required.Split(','))
{
if (serialstring.Contains($"{requirement}\":null"))
{
ValueError(context, requirement);
return;
}
}
base.OnActionExecuting(context);
}
// VALIDATE THE REQUIRED ATTRIBUTES ARE PRESENT
// FOR ASYNC REQUESTS
public override Task OnActionExecutingAsync(HttpActionContext context, CancellationToken token)
{
Dictionary<string, object> model = context.ActionArguments;
var serialstring = JsonConvert.SerializeObject(model);
foreach (var requirement in required.Split(','))
{
if (serialstring.Contains($"{requirement}\":null"))
{
ValueError(context, requirement);
return Task.FromResult(0);
}
}
return base.OnActionExecutingAsync(context, token);
}
// LOG ERROR AND RETURN AND SET ERROR RESPONSE
private static void ValueError(HttpActionContext context, string requirement)
{
var action = context.ActionDescriptor.ActionName;
AppUtils.LogError($"{action} Failed : Missing Required Attribute {requirement}. ");
using (var controller = new BaseApiController { Request = new HttpRequestMessage() })
{
controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());
context.Response = controller.InvalidInputResponse();
}
}
Controller Before EnsuresPresenseOf-attribut
[HttpPost]
[Route("api/Fitbit/Activity/Stats")]
public async Task<HttpResponseMessage> ActivityStats(FitbitRequestDTO request)
{
if (string.IsNullOrEmpty(request.PatientId) || string.IsNullOrEmpty(request.DeviceId))
return InvalidInputResponse();
try
{
var tokenErrorResponse = await EnsureToken(request);
if (tokenErrorResponse != null)
return tokenErrorResponse;
var client = GetFitbitClient();
var stats = await client.GetActivitiesStatsAsync();
return OkResponse(stats);
}
catch (Exception e)
{
const string function = " ActivityStats ";
AppUtils.LogException(function, e);
return SystemErrorResponse(function, e);
}
}
Uppdatera Controller
public async Task<HttpResponseMessage> ActivityStats(FitbitRequestDTO request)
{
try
{
var tokenErrorResponse = await EnsureToken(request);
if (tokenErrorResponse != null)
return tokenErrorResponse;
var client = GetFitbitClient();
var stats = await client.GetActivitiesStatsAsync();
return OkResponse(stats);
}
catch (Exception e)
{
const string function = " ActivityStats ";
AppUtils.LogException(function, e);
return SystemErrorResponse(function, e);
}
}