windows - WCF sin HTTP.SYS
(1)
Los enlaces basados en HTTP de WCF dependen de la clase HttpListener
, que es un contenedor administrado alrededor de la API HTTP. La API HTTP depende de la forma en que el sistema operativo procesa las solicitudes http. Entonces, si usa un sistema operativo que usa el controlador http.sys (Windows 2003 y más reciente), depende de él.
Editar:
Basándome en una muy buena discusión sobre Cassini, pasé dos horas en Reflector. La siguiente descripción es solo mi suposición. No he encontrado ninguna información al respecto, así que tal vez estoy completamente equivocado.
WCF contiene internamente alguna clase abstracta llamada HttpTransportManager
Esta clase se deriva de las clases internas HostedHttpTransportManager
y SharedHttpTransportManager
(esta también existe en la versión para HTTPS). El primero no depende de HttpListener
pero el segundo es. El anterior se usa cuando WCF está alojado en la tubería de ASP.NET: las clases internas HttpModule
y HttpHandler
de System.ServiceModel.Activation ensamblan el uso de HostedHttpRequestAsyncResult
dependiente de HostedHttpTransportManager
. La última se usa cuando se crea HttpChannelListener
(auto-hosting).
Mi conclusión es que el servicio WCF alojado en la tubería de ASP.NET no depende directamente de http.sys, pero el IIS que hospeda la tubería es. Esto permite crear un servidor web personalizado que no dependerá de http.sys pero que podrá alojar ASP.NET y, por lo tanto, WCF. Creo que esto es lo que hace Cassini. El servicio WCF auto hospedado siempre depende de http.sys.
Como escribí anteriormente, esta es solo mi suposición basada en una ingeniería inversa rápida.
Al usar un enlace HTTP en WCF, necesito concederme permisos especiales para poder enlazar a ese puerto / ruta. Entiendo que esto se debe a que WCF acepta el tráfico HTTP a través del controlador http.sys .
En los viejos tiempos, podríamos abrir un socket y enlazarlo a cualquier puerto antiguo que no estuviera en uso, sin ser un administrador. NetTcpBinding todavía puede hacer esto.
Si no me interesa http.sys, ¿hay una manera de decirle a WCF que no lo use y, en su lugar, que simplemente abra un socket antiguo normal sin dejar de usar enlaces HTTP?