WCF без HTTP.SYS - PullRequest
       20

WCF без HTTP.SYS

20 голосов
/ 23 августа 2010

При использовании HTTP-привязки в WCF мне нужно предоставить себе специальные разрешения, чтобы иметь возможность привязываться к этому порту / пути.Я понимаю, что это связано с тем, что WCF принимает HTTP-трафик через драйвер http.sys .

В прежние времена мы могли создать новый сокет и привязать его к любому старому порту, который не использовался, не будучи администратором.NetTcpBinding все еще может это сделать.

Если меня не волнует http.sys, есть ли способ указать WCF не использовать его, а вместо этого просто открыть обычный старый сокет, все еще используя привязки HTTP?

1 Ответ

15 голосов
/ 23 августа 2010

Привязки WCF на основе HTTP зависят от класса HttpListener, который является управляемой оболочкой для HTTP API. HTTP API зависит от того, как операционная система обрабатывает http-запросы. Так что, если вы используете операционную систему, которая использует драйвер http.sys (Windows 2003 и новее), вы зависите от него.

Edit:

Исходя из очень хороших рассуждений о Кассини, я провел два часа в Reflector. Следующее описание является только моим предположением. Я не нашел никакой информации об этом, так что, возможно, я совершенно не прав.

WCF внутри содержит некоторый абстрактный класс, называемый HttpTransportManager, этот класс является производным от внутренних классов HostedHttpTransportManager и SharedHttpTransportManager (этот также существует в версии для HTTPS). Первый не зависит от HttpListener, а второй -. Первый используется, когда WCF размещен в конвейере ASP.NET - внутренние классы HttpModule и HttpHandler из сборки System.ServiceModel.Activation используют HostedHttpRequestAsyncResult в зависимости от HostedHttpTransportManager. Последний используется при создании HttpChannelListener (сам хостинг).

Мой вывод заключается в том, что служба WCF, размещенная в конвейере ASP.NET, напрямую не зависит от http.sys, а IIS, в которой размещается конвейер. Это позволяет создать пользовательский веб-сервер, который не будет зависеть от http.sys, но сможет разместить ASP.NET и т. Д. WCF. Я думаю, что это то, что делает Кассини. Самостоятельно размещенный сервис WCF всегда зависит от http.sys.

Как я уже писал выше, это только мое предположение, основанное на некотором быстром обратном инжиниринге.

...