Подтвердить что ты не робот

Проблемы с использованием WebRequest в Mono

У меня действительно странная проблема с WebRequest в веб-приложении ServiceStack (размещенном XSP на Mono). Похоже, что регистрация модулей запросов работает очень странно; Я использую WebRequest для создания HTTP-запроса, и он терпит неудачу, поскольку он не смог найти создателя для этого "префикса" (HTTP).

Исключением, которое я вижу, является NotSupportedException, и я смог отследить его до того, что ни один создатель не зарегистрирован для префикса HTTP (я нажимаю https://github.com/mono/mono/blob/master/mcs/class/System/System.Net/WebRequest.cs, вокруг строки 479)

EDIT: более подробная информация: NotSupportedException вызывается WebRequest.GetCreator, которая использует префикс URL как ключ для выбора возвращаемого создателя; в моем случае, HttpRequestCreator. Исключение выбрано потому, что для префикса "HTTP" нет создателя, который вообще не существует.

Итак, я немного искал, врывался в источники Mono и обнаружил, что модули (или должны быть) добавлены в раздел webRequestModules файла system.web в одном из различных файлов *.config.

Я посмотрел на файл machine.config, и вот он: System.Net.HttpRequestCreator, System, Version=4.0.0.0

Глядя на Источники WebRequest Mono кажется, что префиксы добавляются из конфигурации (я) действительно, внутри статического конструктора класса (не хороший выбор, IMHO, но все же.. должен работать).

Чтобы проверить это, я попытался добавить HttpRequestCreator в system.net/webRequestModules в мой web.config; это загружается XSP/Mono и приводит к дублированию ключевого исключения (что ожидается, поскольку HttpRequestCreator должен быть уже загружен, поскольку он уже присутствует в machine.config).

Даже незнакомец: если я добавлю mock-обработчик для Http, вот так:

bool res = System.Net.WebRequest.RegisterPrefix ("http", new MyHttpRequestCreator ());
Debug.Assert (res == false);

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

Когда регистрация "не выполняется" (т.е. возвращает false, поскольку префикс "HTTP" уже зарегистрирован), WebRequest может создавать запросы для HTTP. Это как если бы вызов RegisterPrefix "просыпался" статический конструктор и позволял ему работать.

Я озадачен: это похоже на условие гонки при выполнении статического конструктора WebRequest, но это не имеет смысла (среда выполнения защищает статические конструкторы с блокировкой, IIRC)

Что мне не хватает? Как я могу решить или решить эту проблему? Это моя ошибка (непонимание или отсутствие чего-то) или это похоже на ошибку Mono, и поэтому я должен ее отправить?

Подробнее:

моноверсия Mono JIT-компилятор версии 3.0.6 (Debian 3.0.6 + dfsg-1 ~ exp1 ~ pre1)

(Возможно, связанный, неотвеченный вопрос: Протокол HTTP не поддерживается в WebRequest под монофоном)

4b9b3361