Расшифровать параметры запроса для 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));
     }
  }

У меня есть точка останова в моем методе, и я могу приостановить вызов и проверить значения всех параметров.

0 ответов

Другие вопросы по тегам