2010-08-23 10 views
20

Cuando utilizo un enlace HTTP en WCF, necesito otorgarme 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.WCF sin HTTP.SYS

En los viejos tiempos, podíamos actualizar un socket y enlazar a cualquier puerto anterior que no estaba en uso, sin ser un administrador. NetTcpBinding todavía puede hacer esto.

Si no me importa http.sys, ¿hay alguna manera de decirle a WCF que no lo use y, en su lugar, simplemente abrir un viejo socket mientras todavía usa enlaces HTTP?

Respuesta

14

WCF Los enlaces basados ​​en HTTP dependen de la clase HttpListener que es un contenedor administrado alrededor de la API HTTP. HTTP API depende de la forma en que el sistema de operación procesa las solicitudes http. Por lo tanto, si usa el sistema operativo que usa el controlador http.sys (Windows 2003 y posterior), depende de él.

Editar:

Sobre la base de muy buena discusión sobre Cassini pasé dos horas en el 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 por las clases internas HostedHttpTransportManager y SharedHttpTransportManager (esta también existe en la versión para HTTPS). El primero no depende de HttpListener, pero el último sí lo es. El primero se utiliza cuando WCF está alojado en ASP.NET pipeline - clases internas HttpModule y HttpHandler del ensamblado System.ServiceModel.Activation use HostedHttpRequestAsyncResult según HostedHttpTransportManager. El último se usa cuando se crea HttpChannelListener (autohospedaje).

Mi conclusión es que el servicio WCF alojado en la canalización ASP.NET no depende directamente de http.sys, pero IIS es el que aloja la canalización. Esto permite crear un servidor web personalizado que no dependerá de http.sys, pero podrá alojar ASP.NET y, por lo tanto, WCF. Creo que esto es lo que hace Cassini. El servicio WCF alojado automáticamente siempre depende de http.sys.

Como escribí anteriormente, esto es solo mi suposición basada en una ingeniería inversa rápida.

+1

El servidor web visual (Cassini) en VS se ejecuta como un no administrador, puede escuchar las solicitudes HTTP e incluso puede servir servicios WCF de BasicHttpBinding. Otros servidores web tampoco necesitan depender de HTTP.SYS. Entonces debe haber una forma de eludirlo. –

Cuestiones relacionadas