void BuildSink (IServerChannelSinkProvider sinkProvider) { //resolve names (modified from TcpChannel) if (machineName == null) { if (useIPAddress) { if (!bindAddress.Equals (IPAddress.Any)) { machineName = bindAddress.ToString (); } else { IPHostEntry hostEntry = Dns.Resolve (Dns.GetHostName ()); if (hostEntry.AddressList.Length == 0) throw new RemotingException ("IP address could not be determined for this host"); // We DON'T want to take the resolved address from the hostEntry, since the socket // should still bind to IPAddress.Any, so that we get the loopback too machineName = hostEntry.AddressList[0].ToString (); } } else { IPHostEntry hostEntry = Dns.GetHostByName (Dns.GetHostName ()); bindAddress = hostEntry.AddressList[0]; machineName = hostEntry.HostName; } } if (sinkProvider == null) { //build a default chain that can handle wsdl, soap, binary sinkProvider = new SdlChannelSinkProvider (); //for wsdl sinkProvider.Next = new SoapServerFormatterSinkProvider (); sinkProvider.Next.Next = new BinaryServerFormatterSinkProvider (); } //MS compat: channelData is null when port < 0 if (port >= 0) { channelData = new ChannelDataStore (null); IServerChannelSinkProvider provider = sinkProvider; while (provider != null) { provider.GetChannelData (channelData); provider = provider.Next; } } //create the sink chain and add an HTTP sink IServerChannelSink nextSink = ChannelServices.CreateServerChannelSinkChain (sinkProvider, this); sink = new HttpServerTransportSink (nextSink); // BaseChannelWithProperties wants this to be set with the chain base.SinksWithProperties = nextSink; StartListening (null); }
} // SetupChannel private IServerChannelSinkProvider CreateDefaultServerProviderChain() { IServerChannelSinkProvider chain = new SdlChannelSinkProvider(); IServerChannelSinkProvider sink = chain; sink.Next = new SoapServerFormatterSinkProvider(); sink = sink.Next; sink.Next = new BinaryServerFormatterSinkProvider(); return chain; } // CreateDefaultServerProviderChain