Будет ли запрос в IIS выполняться в одном потоке? - PullRequest
8 голосов
/ 29 октября 2009

У нас есть система, которая работает в IIS.

Система всегда должна работать с использованием одной и той же «культуры», но мы не можем полагаться на правильность настроек сервера.

Один из способов сделать это - указывать культуру каждый раз, когда мы делаем ToString.

Однако нам было интересно, возможно ли установить культуру в потоке в начале метода и полагаться на весь код в этом методе, выполняемый в одном потоке?

Ответы [ 4 ]

18 голосов
/ 29 октября 2009

Нет. ASP.NET демонстрирует гибкость потока - в некоторых ситуациях запрос может перемещаться из одного потока в другой в определенных точках его жизненного цикла. (Это не «просто где-то»; этот пост дает более конкретные детали.)

К сожалению, это не так ясно задокументировано, как могло бы быть, и это довольно сложно спровоцировать - так что вы можете легко попасть в ситуацию, когда при тестовых нагрузках все в порядке - но на производстве все идет не так.

Однако, некоторые тесты, которые я запускал некоторое время назад (ищите "jskeet" на странице), предполагают, что Thread.CurrentCulture сохраняется, даже когда запускается ловкость потоков.

3 голосов
/ 29 октября 2009

Если вы знаете, что хотите, чтобы культура оставалась одинаковой для всех потоков, то это должно быть хорошим подходом.

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

2 голосов
/ 29 октября 2009

Вы динамически меняете культуру? Если нет, вы можете установить культуру в файле web.config.

<system.web>
  <globalization culture="ja-JP" uiCulture="zh-HK" />
</system.web>

Вы также можете установить его на уровне страницы:

<%@Page Culture="fr-FR" Language="C#" %>

А по теме:

Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");

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

1 голос
/ 29 октября 2009

Как отмечали другие, ASP.NET может решить обработать части одного и того же запроса в различных потоках. Однако вы говорите об инициализации статических потоков в начале каждого метода , поэтому это ограничение к вам не относится: я совершенно уверен, что ASP.NET не может изменить текущий поток в середине одного из ваших методов , так что ваш подход должен быть в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...