Если я создаю делегирующий обработчик в веб-API, чтобы сделать некоторую логику предварительной обработки.это будет мешать производительности? - PullRequest
0 голосов
/ 29 ноября 2018

Я создал делегирующий обработчик для обработки моей логики предварительной обработки.Логика просто проверяет наличие любого специального символа в запросе, а затем кодирует его и переходит в жизненный цикл.Ниже приведен код:

public class EncodingRequest : DelegatingHandler
{
protected override async Task<System.Net.Http.HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        //deserialize the request that is in json format
        dynamic dynamicJson = JsonConvert.DeserializeObject(request.Content.ReadAsStringAsync().Result);

        //using regex to match the pattern for the Json request object and directly replacing and encoding the desired value

        //SUGGESTION: Used JSon JProperties to modified the request by encoding it. This was taking more loop as we need to go through every child element of Json
        //If the JSON have child hierarchy(a child having its own child and so on) then we have to loop to each child to encode the request. So, more convenient way was
        //to use regex Replace method that matches the pattern and replace it with the new value.

        string regexPattern = "(?<=: \")[^\",\r\n]*";
        System.Text.RegularExpressions.Regex rgx = new System.Text.RegularExpressions.Regex(regexPattern);

        //using REGEX's replace function to find the matching pattern and then replace the value with the encoded value
        dynamicJson = rgx.Replace(dynamicJson.ToString(), new MatchEvaluator((m) => { return Encoder.HtmlEncode(m.ToString()); }));

        //chanding the request content with the modified request with header type as "application/json"
        request.Content = new StringContent(dynamicJson,
                                System.Text.Encoding.UTF8,
                                "application/json");//CONTENT-TYPE header

        Core.Logging.LogManager.LogVerbose(request.Content.ReadAsStringAsync().Result);

        //original call
        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
        Core.Logging.LogManager.LogVerbose(response.ToString());


        return response;
    }
}

Итак, все работает как положено.Тем не менее, это будет препятствовать производительности моего веб-API.Если да, то как это будет мешать и какую другую технику я должен использовать.Если это WCF, то я бы использовал архитектуру времени выполнения (IServiceBehavior, IOperationBehavior).Как я буду действовать отдельно от использования делегирующего обработчика, если это ухудшит производительность.

...