Suche…


Einführung

Aktionsfilterattribute sind ein Teil des ASP .NET Frameworks, das ich als hilfreich erachte, um dem DRY-Prinzip zu folgen. Sie können mehrere Zeilen der allgemeinen Logik durch ein einfaches deklaratives Tag ersetzen. Das Framework bietet standardmäßig mehrere nützliche Aktionsfilterattribute, z. B. die Berechtigungs- und Handle-Fehlerattribute. Dieses Handbuch soll Ihnen zeigen, wie Sie Ihr eigenes benutzerdefiniertes Attribut erstellen.

EnsurePresenseOfAttribute

Dies ist ein Beispiel für ein Attribut, das ich erstellt habe, um zu bestätigen, dass die erforderlichen Parameter im Anforderungsobjekt zugewiesen wurden, die auf einer POST-Route empfangen werden. Ich habe mich für diesen Ansatz entschieden, weil der Standardansatz von ModelState.IsValid nicht gültig war. Dies liegt daran, dass die erforderlichen Attribute abhängig davon sind, welche Aktion aufgerufen wird.

// ATTRIBUTE NUR FÜR METHODEN GÜLTIG [AttributeUsage (AttributeTargets.Method)] // // Öffentliche Klasse INHALT ActionFilterAttribute EnsurePresencesOfAttribute: ActionFilterAttribute {// ReSharper einmal deaktivieren InconsistentNaming public string required {get; einstellen; }

// 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 vor dem Attribut "EnsuresPresenseOf"

        [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);
            }
        }

Controller aktualisieren

        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);
            }
        }


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow