21

WCF で HTTP バインディングを使用する場合、そのポート/パスにバインドできるように特別なアクセス許可を自分自身に付与する必要があります。これは、WCF がhttp.sysドライバーを介して HTTP トラフィックを受け入れるためだと理解しています。

昔は、管理者でなくても、ソケットを新しく作成し、使用されていない古いポートにバインドできました。NetTcpBinding はこれを行うことができます。

http.sysを気にしない場合、WCFにそれを使用しないように指示し、代わりにHTTPバインディングを使用しながら通常の古いソケットを開く方法はありますか?

4

1 に答える 1

16

HttpListenerWCF HTTPベースのバインディングは、 HTTPAPIのラッパーであるマネージドクラスに依存しています。HTTP APIは、オペレーティングシステムがhttpリクエストを処理する方法に依存します。したがって、http.sysドライバ(Windows 2003以降)を使用するオペレーティングシステムを使用する場合は、それに依存しています。

編集:

カッシーニについての非常に良い議論に基づいて、私はリフレクターで2時間過ごしました。以下の説明は私の仮定にすぎません。私はそれについての情報を見つけていないので、多分私は完全に間違っています。

HttpTransportManagerWCFには、内部クラスによって派生したこのクラスHostedHttpTransportManagerと呼ばれる抽象クラスが内部に含まれていますSharedHttpTransportManager(これはHTTPSのバージョンにも存在します)。前者は依存していませんHttpListenerが、後者は依存しています。前者は、WCFがASP.NETパイプラインでホストされている場合に使用されます-内部クラスHttpModuleおよびHttpHandlerSystem.ServiceModel.Activationアセンブリからの使用はHostedHttpRequestAsyncResultに依存しHostedHttpTransportManagerます。後者は、作成時に使用さHttpChannelListenerれます(セルフホスティング)。

私の結論は、ASP.NETパイプラインでホストされているWCFサービスはhttp.sysに直接依存していませんが、パイプラインをホストしているIISは依存しているということです。これにより、http.sysに依存しないが、ASP.NETなどのWCFをホストできるカスタムWebサーバーを作成できます。これがカッシーニの仕事だと思います。セルフホストのWCFサービスは、常にhttp.sysに依存しています。

上で書いたように、これはいくつかのクイックリバースエンジニアリングに基づく私の推測にすぎません。

于 2010-08-23T15:15:01.287 に答える