Расшифровать параметры запроса для HTTP-вызова в веб-API
У меня есть веб-API, разработанный на C#, ориентированный на .NET Framework 4.7.1. Он используется некоторыми интерфейсными приложениями Angular. Некоторые из этих приложений отправляют команды HTTP DELETE в веб-API, передавая определенные значения в качестве параметров запроса команде HTTP DELETE. Недавно мы обнаружили ситуацию, которая не была обнаружена ранее. Одним из параметров запроса является комментарий, и пользователь ввел недопустимый символ («#») как часть комментария. Очевидно, это испортило весь URL-адрес, поэтому я решил, что мне нужно закодировать параметры запроса всех этих HTTP-команд. В приложении Angular я могу использовать encodeURIComponent. На стороне веб-API я обнаружил, что могу использовать метод WebUtility.HtmlDecode. Проблема, с которой я сталкиваюсь, заключается в том, где добавить этот вызов в канал HTTP в приложении веб-API. Мой стартап.Класс cs имеет следующие два метода (я предполагаю, что вызов «HtmlDecode» должен выполняться в одном из них):
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// add the repository service
services.AddScoped<IRepository, SqlServerRepository>();
services.AddMvc();
// local dateTime
services.AddMvc().AddJsonOptions(options =>
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local
);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseCors(builder => builder.WithOrigins("http://localhost:4200",
"http://localhost:4201",
"http://localhost:4202")
.AllowCredentials()
.AllowAnyHeader()
.AllowAnyMethod());
app.UseMvc();
}
Вот как выглядит моя команда HTTP Delete в приложении Angular после того, как URL был закодирован:
https: // localhost:44344 / api / invoices%2F839%3Fcomment%3DInvoice%20%23%20839&sessionHash=21AAEE0EA6631EF381CAC140460DF9BF4A6686
Без кодировки URL-адрес будет
https: // localhost:44344 / api / invoices / 839?comment= Счет-фактура № 839&sessionHash=21AAEE0EA6631EF381CAC140460DF9BF4A6686
Очевидно, что символ "#" портит URL, отсюда и необходимость в кодировке.
На моей стороне веб-API вызывается правильный метод правильного контроллера, но внутри него идентификатор счета равен 0, комментарий равен нулю, а sessionHash также равен нулю. Вот код моего метода:
[HttpDelete("{invoiceId}")]
public IActionResult DeleteInvoice(string sessionHash, int invoiceId, [FromQuery] string comment)
{
try
{
if (string.IsNullOrEmpty(sessionHash))
{
return BadRequest("The user is not authenticated!");
}
if (invoiceId == 0)
{
return BadRequest("The invoice Id was not provided!");
}
int result = _repository.DeleteInvoice(sessionHash, invoiceId, comment);
if (result == -1)
{
return Ok();
}
return BadRequest($"The invoice with Id {invoiceId} could not be deleted.");
}
catch (Exception ex)
{
return BadRequest(ExceptionErrorBuilder.GetShortErrorMessage(ex));
}
}
У меня есть точка останова в моем методе, и я могу приостановить вызов и проверить значения всех параметров.