public void EndpointDispatcherAddTest6() { var uri = CreateAvailableUri("http://localhost:37564"); ServiceHost h = new ServiceHost(typeof(TestContract), uri); var binding = new BasicHttpBinding(); var listener = new MyChannelListener <IReplyChannel> (uri); MyChannelDispatcher d = new MyChannelDispatcher(listener); var ed = new EndpointDispatcher(new EndpointAddress(uri), "", ""); d.Endpoints.Add(ed); Assert.IsFalse(d.Attached, "#x1"); ed.DispatchRuntime.Type = typeof(TestContract); d.MessageVersion = MessageVersion.Default; h.ChannelDispatchers.Add(d); Assert.IsTrue(d.Attached, "#x2"); d.Open(); // At this state, it does *not* call AcceptChannel() yet. Assert.IsFalse(listener.AcceptChannelTried, "#1"); Assert.IsFalse(listener.WaitForChannelTried, "#2"); Assert.IsNotNull(ed.DispatchRuntime, "#3"); Assert.IsNull(ed.DispatchRuntime.InstanceProvider, "#4"); Assert.IsNull(ed.DispatchRuntime.InstanceContextProvider, "#5"); // it is not still set after ChannelDispatcher.Open(). Assert.IsNull(ed.DispatchRuntime.InstanceProvider, "#5.2"); Assert.IsNull(ed.DispatchRuntime.SingletonInstanceContext, "#6"); d.Close(); // we don't have to even close it. }
[ExpectedException(typeof(InvalidOperationException))] // i.e. it is thrown synchronously in current thread. public void EndpointDispatcherAddTest4() { var uri = CreateAvailableUri("http://localhost:37564"); ServiceHost h = new ServiceHost(typeof(TestContract), uri); var listener = new MyChannelListener(uri); MyChannelDispatcher d = new MyChannelDispatcher(listener); var ed = new EndpointDispatcher(new EndpointAddress(uri), "", ""); Assert.IsNotNull(ed.DispatchRuntime, "#1"); Assert.IsNull(ed.DispatchRuntime.InstanceProvider, "#2"); Assert.IsNull(ed.DispatchRuntime.InstanceContextProvider, "#3"); Assert.IsNull(ed.DispatchRuntime.InstanceProvider, "#3.2"); Assert.IsNull(ed.DispatchRuntime.SingletonInstanceContext, "#4"); d.Endpoints.Add(ed); d.MessageVersion = MessageVersion.Default; h.ChannelDispatchers.Add(d); // it misses DispatchRuntime.Type, which seems set // automatically when the dispatcher is created in // ordinal process but need to be set manually in this case. try { d.Open(); try { // should not reach here, but in case it didn't, it must be closed. d.Close(TimeSpan.FromSeconds(10)); } catch { } } finally { Assert.AreEqual(CommunicationState.Opened, listener.State, "#5"); } }
[ExpectedException(typeof(InvalidOperationException))] // i.e. it is thrown synchronously in current thread. public void EndpointDispatcherAddTest5() { var uri = CreateAvailableUri("http://localhost:37564"); ServiceHost h = new ServiceHost(typeof(TestContract), uri); var binding = new BasicHttpBinding(); var listener = new MyChannelListener(uri); MyChannelDispatcher d = new MyChannelDispatcher(listener); var ed = new EndpointDispatcher(new EndpointAddress(uri), "", ""); d.Endpoints.Add(ed); ed.DispatchRuntime.Type = typeof(TestContract); // different from Test4 d.MessageVersion = MessageVersion.Default; h.ChannelDispatchers.Add(d); // It rejects "unrecognized type" of the channel listener. // Test6 uses IChannelListener<IReplyChannel> and works. d.Open(); // should not reach here, but in case it didn't, it must be closed. d.Close(TimeSpan.FromSeconds(10)); }