static Type MaybeCreateListener(bool actuallyCreate, Type[] supportedChannels, Binding binding, BindingParameterCollection parameters, Uri listenUriBaseAddress, string listenUriRelativeAddress, ListenUriMode listenUriMode, ServiceThrottle throttle, out IChannelListener result, bool supportContextSession) { // if actuallyCreate is true, then this behaves like CreateListener() // else this behaves like CanCreateListener() // result is channel type that was (would be) created, null if can't create // // Ugly API helps refactor common code in these two similar-but-different methods result = null; for (int i = 0; i < supportedChannels.Length; i++) { Type channelType = supportedChannels[i]; if (channelType == typeof(IInputChannel)) { if (binding.CanBuildChannelListener<IInputChannel>(parameters)) { if (actuallyCreate) { result = binding.BuildChannelListener<IInputChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IInputChannel); } } if (channelType == typeof(IReplyChannel)) { if (binding.CanBuildChannelListener<IReplyChannel>(parameters)) { if (actuallyCreate) { result = binding.BuildChannelListener<IReplyChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IReplyChannel); } } if (channelType == typeof(IDuplexChannel)) { if (binding.CanBuildChannelListener<IDuplexChannel>(parameters)) { if (actuallyCreate) { result = binding.BuildChannelListener<IDuplexChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IDuplexChannel); } } if (channelType == typeof(IInputSessionChannel)) { if (binding.CanBuildChannelListener<IInputSessionChannel>(parameters)) { if (actuallyCreate) { result = binding.BuildChannelListener<IInputSessionChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IInputSessionChannel); } } if (channelType == typeof(IReplySessionChannel)) { if (binding.CanBuildChannelListener<IReplySessionChannel>(parameters)) { if (actuallyCreate) { result = binding.BuildChannelListener<IReplySessionChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IReplySessionChannel); } } if (channelType == typeof(IDuplexSessionChannel)) { if (binding.CanBuildChannelListener<IDuplexSessionChannel>(parameters)) { if (actuallyCreate) { result = binding.BuildChannelListener<IDuplexSessionChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IDuplexSessionChannel); } } } // If the binding does not support the type natively, try to adapt for (int i = 0; i < supportedChannels.Length; i++) { Type channelType = supportedChannels[i]; // For SessionMode.Allowed or SessionMode.NotAllowed we will accept session-ful variants as well and adapt them if (channelType == typeof(IInputChannel)) { if (binding.CanBuildChannelListener<IInputSessionChannel>(parameters)) { if (actuallyCreate) { IChannelListener<IInputSessionChannel> temp = binding.BuildChannelListener<IInputSessionChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); result = DatagramAdapter.GetInputListener(temp, throttle, binding); } return typeof(IInputSessionChannel); } } if (channelType == typeof(IReplyChannel)) { if (binding.CanBuildChannelListener<IReplySessionChannel>(parameters)) { if (actuallyCreate) { IChannelListener<IReplySessionChannel> temp = binding.BuildChannelListener<IReplySessionChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); result = DatagramAdapter.GetReplyListener(temp, throttle, binding); } return typeof(IReplySessionChannel); } } if (supportContextSession) { // and for SessionMode.Required, it is possible that the InstanceContextProvider is handling the session management, so // accept datagram variants if that is the case if (channelType == typeof(IReplySessionChannel)) { if (binding.CanBuildChannelListener<IReplyChannel>(parameters) && binding.GetProperty<IContextSessionProvider>(parameters) != null) { if (actuallyCreate) { result = binding.BuildChannelListener<IReplyChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IReplyChannel); } } } } return null; }
private static System.Type MaybeCreateListener(bool actuallyCreate, System.Type[] supportedChannels, Binding binding, BindingParameterCollection parameters, Uri listenUriBaseAddress, string listenUriRelativeAddress, ListenUriMode listenUriMode, ServiceThrottle throttle, out IChannelListener result, bool supportContextSession) { result = null; for (int i = 0; i < supportedChannels.Length; i++) { System.Type type = supportedChannels[i]; if ((type == typeof(IInputChannel)) && binding.CanBuildChannelListener<IInputChannel>(parameters)) { if (actuallyCreate) { result = binding.BuildChannelListener<IInputChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IInputChannel); } if ((type == typeof(IReplyChannel)) && binding.CanBuildChannelListener<IReplyChannel>(parameters)) { if (actuallyCreate) { result = binding.BuildChannelListener<IReplyChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IReplyChannel); } if ((type == typeof(IDuplexChannel)) && binding.CanBuildChannelListener<IDuplexChannel>(parameters)) { if (actuallyCreate) { result = binding.BuildChannelListener<IDuplexChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IDuplexChannel); } if ((type == typeof(IInputSessionChannel)) && binding.CanBuildChannelListener<IInputSessionChannel>(parameters)) { if (actuallyCreate) { result = binding.BuildChannelListener<IInputSessionChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IInputSessionChannel); } if ((type == typeof(IReplySessionChannel)) && binding.CanBuildChannelListener<IReplySessionChannel>(parameters)) { if (actuallyCreate) { result = binding.BuildChannelListener<IReplySessionChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IReplySessionChannel); } if ((type == typeof(IDuplexSessionChannel)) && binding.CanBuildChannelListener<IDuplexSessionChannel>(parameters)) { if (actuallyCreate) { result = binding.BuildChannelListener<IDuplexSessionChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IDuplexSessionChannel); } } for (int j = 0; j < supportedChannels.Length; j++) { System.Type type2 = supportedChannels[j]; if ((type2 == typeof(IInputChannel)) && binding.CanBuildChannelListener<IInputSessionChannel>(parameters)) { if (actuallyCreate) { IChannelListener<IInputSessionChannel> inner = binding.BuildChannelListener<IInputSessionChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); result = DatagramAdapter.GetInputListener(inner, throttle, binding); } return typeof(IInputSessionChannel); } if ((type2 == typeof(IReplyChannel)) && binding.CanBuildChannelListener<IReplySessionChannel>(parameters)) { if (actuallyCreate) { IChannelListener<IReplySessionChannel> listener2 = binding.BuildChannelListener<IReplySessionChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); result = DatagramAdapter.GetReplyListener(listener2, throttle, binding); } return typeof(IReplySessionChannel); } if ((supportContextSession && (type2 == typeof(IReplySessionChannel))) && (binding.CanBuildChannelListener<IReplyChannel>(parameters) && (binding.GetProperty<IContextSessionProvider>(parameters) != null))) { if (actuallyCreate) { result = binding.BuildChannelListener<IReplyChannel>(listenUriBaseAddress, listenUriRelativeAddress, listenUriMode, parameters); } return typeof(IReplyChannel); } } return null; }