asp.net-web-api
Een aangepast ActionFilterAttribute maken
Zoeken…
Invoering
Actiefilters Kenmerken zijn een onderdeel van het ASP .NET Framework dat ik nuttig vind om het DRY-principe te volgen. U kunt meerdere regels met algemene logica vervangen door één eenvoudige declaratieve tag. Het framework biedt standaard verschillende nuttige Action Filter-attributen, zoals de Authorize and Handle Error-attributen. Deze handleiding is bedoeld om u te laten zien hoe u uw eigen aangepaste kenmerk kunt maken.
EnsurePresenseOfAttribute
Dit is een voorbeeld van een kenmerk dat ik heb gemaakt om te valideren dat vereiste parameters zijn toegewezen in het aanvraagobject ontvangen in een POST-route. Ik heb voor deze aanpak gekozen omdat de standaard ModelState.IsValid- aanpak niet geldig was. Dit komt omdat de vereiste kenmerken variëren op basis van de actie die wordt genoemd.
// ALLEEN ATTRIBUT GELDIG VOOR METHODEN [AttributeUsage (AttributeTargets.Method)] // INHERIT ActionFilterAttribute public class ZorgPresencesOfAttribute: ActionFilterAttribute {// ReSharper uitschakelen eenmaal InconsistentNaming openbare string vereist {get; vast te stellen; }
// 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 voor verzekert PresresOf-kenmerk
[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);
}
}
Update 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);
}
}