mono httpwebrequest servicestack xsp

Problemas al usar WebRequest en Mono



httpwebrequest servicestack (0)

Tengo un problema realmente extraño con WebRequest en una aplicación web de ServiceStack (alojada por XSP en Mono). Parece que el registro de módulos de solicitud funciona de una manera muy extraña; Estoy usando WebRequest para crear una solicitud HTTP, y está fallando porque no pudo encontrar un creador para ese "prefijo" (HTTP).

La excepción que estoy viendo es NotSupportedException , y pude rastrearla hasta el hecho de que no hay ningún creador registrado para el prefijo HTTP (estoy presionando https://github.com/mono/mono/blob/master/mcs/class/System/System.Net/WebRequest.cs , alrededor de la línea 479)

EDIT: más detalles: NotSupportedException es lanzado por WebRequest.GetCreator , que usa el prefijo de URL como una clave para elegir qué creador devolver; en mi caso, un HttpRequestCreator . La excepción se produce porque no hay ningún creador registrado para el prefijo "HTTP" (en realidad, no hay creadores en absoluto).

Así que busqué un poco, busqué en las fuentes Mono y descubrí que los módulos se han (o deberían) agregarse a la sección webRequestModules de system.web en uno de los diversos archivos * .config.

Miré mi archivo machine.config, y ahí está: System.Net.HttpRequestCreator, System, Version=4.0.0.0

Al https://github.com/mono/mono/blob/master/mcs/class/System/System.Net/WebRequest.cs , parece que los prefijos se agregan desde las configuraciones, de hecho, dentro del constructor estático de la clase (no es una buena opción, en mi humilde opinión, pero aún así debería funcionar).

Para probarlo, intenté agregar un HttpRequestCreator a system.net/webRequestModules en mi web.config ; XSP / Mono carga esto y da como resultado una excepción de clave duplicada (que se espera, ya que HttpRequestCreator ya debería estar cargado, ya que ya está presente en machine.config).

Aún más extraño: si agrego un controlador de simulacro para HTTP, así:

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

la aserción pasa a veces ... a veces no! (RegisterPrefix devuelve "falso" si un creador para el mismo prefijo ya está registrado; espero que siempre devuelva falso, pero este no es el caso. De nuevo, es completamente aleatorio)

Cuando el registro "falla" (es decir, devuelve falso porque ya está registrado un prefijo "HTTP"), entonces WebRequest puede crear solicitudes para HTTP. Es como si llamar a RegisterPrefix "despierte" al constructor estático y lo deje correr.

Estoy perplejo: parece una condición de carrera en la ejecución del constructor estático de WebRequest, pero esto no tiene sentido (el tiempo de ejecución protege a los constructores estáticos con un bloqueo, IIRC)

¿Qué me estoy perdiendo? ¿Cómo podría resolver o solucionar este problema? ¿Es culpa mía (malentendido o falta algo) o parece un error Mono, y por lo tanto debería enviarlo?

Detalles:

versión mono versión 3.0.6 del compilador Mono JIT (Debian 3.0.6 + dfsg-1 ~ exp1 ~ pre1)

(Posiblemente relacionada, pregunta sin respuesta: protocolo HTTP no compatible con WebRequest en mono )