Доступ к HttpContext через статический класс работает «корректно» с разными запросами.C#

Место общения программистов C#
Ответить
Anonymous
 Доступ к HttpContext через статический класс работает «корректно» с разными запросами.

Сообщение Anonymous »

Я нашел эту статью, пытаясь решить проблему, требующую использования некоторых заголовков в неконтроллерах.

Я довольно скептически отношусь к этому подходу, и автор не отвечает. Меня больше всего беспокоит подход к использованию глобального статического HttpContext. Я думал, что это не должно работать с двумя запросами. Пример этого случая приведен ниже (вместе с подходом, представленным в упомянутой мной статье):

Код: Выделить всё

public static class AppContext
{
public static IHttpContextAccessor HttpContextAccessor { get; set; }
public static void Configure(IHttpContextAccessor accessor)
{
HttpContextAccessor = accessor;
}
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env,
IHttpContextAccessor contextAccessor)
{
AppContext.Configure(contextAccessor);
...
}

[Route("api/[controller]")]
[ApiController]
public class ExampleController : ControllerBase
{
[HttpGet("{number}")]
public IActionResult Example(int number)
{
if (number == 1)
{
Thread.Sleep(10000);
}

var result = AppContext.HttpContextAccessor.HttpContext.Request.GetDisplayUrl();

return Ok(result + " " + number);
}
}
Хочу отметить, что автор использует name AppContext для этого статического класса, и это именно то, что я ожидал (и это действительно бесполезно). затем).

Однако меня смущает фактическое поведение. Я отлаживаю фрагмент, устанавливая точку останова на строке с var result = .... Сначала я отправляю запрос с номером = 1, который некоторое время засыпает, а затем отправляю второй запрос с другим значением номера. Я пропускаю установленную точку останова для первого запроса и жду, пока первый запрос (с номером = 1) остановится на ней. Затем я проверяю, что возвращает GetDisplayUrl(), и он возвращает путь с /1 (это действительно путь для этого запроса, который неактивен в течение 10 секунд). Я ожидаю, что оно закончится на /2, поскольку статическое поле с IHttpContextAccessor статического класса AppContext было переписано вторым запросом в методе ConfigurationServices().

Я считаю, что упускаю что-то важное, и был бы рад, если бы вы также предоставили некоторые источники, которые я (и другие в замешательстве) могли бы использовать, чтобы заполнить пробел.

Не могли бы вы также дать мне еще немного информации об использовании этого подхода? Страдает ли тестируемость (поскольку я использую статический класс повсюду в приложении) и каким образом?

Подробнее здесь: https://stackoverflow.com/questions/575 ... t-requests
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»