Я создал делегирующий обработчик для обработки моей логики предварительной обработки.Логика просто проверяет наличие любого специального символа в запросе, а затем кодирует его и переходит в жизненный цикл.Ниже приведен код:
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).Как я буду действовать отдельно от использования делегирующего обработчика, если это ухудшит производительность.