added samples
[windows-sources.git] / sdk / samples / WCFSamples / TechnologySamples / Extensibility / Channels / HttpCookieSession / CS / extensions / HttpCookieReplySessionChannel.cs
blob28bb8e42854af7bf2dac3b8165078590c9e4776b
2 // Copyright (c) Microsoft Corporation. All Rights Reserved.
4 namespace Microsoft.ServiceModel.Samples
6 using System;
7 using System.ServiceModel;
8 using System.ServiceModel.Channels;
9 using System.Collections.Generic;
10 using System.Threading;
12 class HttpCookieReplySessionChannel
13 : ChannelBase, IReplySessionChannel
15 EndpointAddress localAddress;
16 HttpCookieReplySessionChannelListener parent;
17 InputQueue<RequestContext> requestQueue;
18 HttpCookieReplySession session;
19 TimeSpan sessionTimeout;
21 public HttpCookieReplySessionChannel(HttpCookieReplySessionChannelListener parent, EndpointAddress localAddress)
22 : base(parent)
24 this.parent = parent;
25 this.localAddress = localAddress;
26 this.sessionTimeout = parent.SessionTimeout;
27 this.session = new HttpCookieReplySession();
28 this.requestQueue = new InputQueue<RequestContext>();
31 public EndpointAddress LocalAddress
33 get { return localAddress; }
36 public IInputSession Session
38 get { return this.session; }
41 protected override void OnAbort()
43 this.requestQueue.Close();
46 protected override void OnClose(TimeSpan timeout)
48 this.requestQueue.Close();
51 protected override IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state)
53 this.requestQueue.Close();
54 return new CompletedAsyncResult(callback, state);
57 protected override void OnEndClose(IAsyncResult result)
59 CompletedAsyncResult.End(result);
62 protected override void OnOpen(TimeSpan timeout)
66 protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
68 return new CompletedAsyncResult(callback, state);
71 protected override void OnEndOpen(IAsyncResult result)
73 CompletedAsyncResult.End(result);
76 public IAsyncResult BeginReceiveRequest(AsyncCallback callback, object state)
78 return BeginReceiveRequest(this.DefaultReceiveTimeout, callback, state);
81 public IAsyncResult BeginReceiveRequest(TimeSpan timeout, AsyncCallback callback, object state)
83 ValidateTimeSpan(timeout);
84 return new ReceiveRequestAsyncResult(this, timeout, callback, state);
87 public RequestContext EndReceiveRequest(IAsyncResult result)
89 return ReceiveRequestAsyncResult.End(result);
92 public IAsyncResult BeginTryReceiveRequest(
93 TimeSpan timeout, AsyncCallback callback,
94 object state)
96 ValidateTimeSpan(timeout);
97 return this.requestQueue.BeginDequeue(timeout, callback, state);
100 public bool EndTryReceiveRequest(IAsyncResult result,
101 out RequestContext context)
103 return this.requestQueue.EndDequeue(result, out context);
106 public RequestContext ReceiveRequest()
108 return ReceiveRequest(DefaultReceiveTimeout);
111 public RequestContext ReceiveRequest(TimeSpan timeout)
113 ValidateTimeSpan(timeout);
114 return this.requestQueue.Dequeue(timeout);
117 public bool TryReceiveRequest(TimeSpan timeout,
118 out RequestContext context)
120 ValidateTimeSpan(timeout);
121 return this.requestQueue.Dequeue(timeout, out context);
124 public IAsyncResult BeginWaitForRequest(
125 TimeSpan timeout, AsyncCallback callback,
126 object state)
128 return this.requestQueue.BeginWaitForItem(timeout, callback, state);
131 public bool EndWaitForRequest(IAsyncResult result)
133 return this.requestQueue.EndWaitForItem(result);
136 public bool WaitForRequest(TimeSpan timeout)
138 return this.requestQueue.WaitForItem(timeout);
141 public void Enqueue(RequestContext item, ItemDequeuedCallback dequeuedCallback)
143 this.requestQueue.EnqueueAndDispatch(item, dequeuedCallback);
146 static void ValidateTimeSpan(TimeSpan timeout)
148 if (timeout < TimeSpan.Zero)
150 throw new ArgumentOutOfRangeException("timeout", timeout,
151 "Timeout must be greater than or equal to TimeSpan.Zero. To disable timeout, specify TimeSpan.MaxValue.");
155 class ReceiveRequestAsyncResult : AsyncResult
157 IReplyChannel channel;
158 TimeSpan timeout;
159 static AsyncCallback onReceiveRequest = new AsyncCallback(OnReceiveRequest);
160 RequestContext requestContext;
162 public ReceiveRequestAsyncResult(IReplyChannel channel, TimeSpan timeout, AsyncCallback callback, object state)
163 : base(callback, state)
165 this.channel = channel;
166 this.timeout = timeout;
167 IAsyncResult result = channel.BeginTryReceiveRequest(timeout, onReceiveRequest, this);
169 if (!result.CompletedSynchronously)
171 return;
174 OnReceiveRequestCore(result);
175 base.Complete(true);
178 public static RequestContext End(IAsyncResult result)
180 ReceiveRequestAsyncResult thisPtr = AsyncResult.End<ReceiveRequestAsyncResult>(result);
181 return thisPtr.requestContext;
184 void OnReceiveRequestCore(IAsyncResult result)
186 if (!this.channel.EndTryReceiveRequest(result, out this.requestContext))
188 throw new TimeoutException(string.Format("Receive request timed out after {0}.", timeout));
192 static void OnReceiveRequest(IAsyncResult result)
194 if (result.CompletedSynchronously)
196 return;
199 ReceiveRequestAsyncResult thisPtr = (ReceiveRequestAsyncResult)result.AsyncState;
200 Exception completionException = null;
203 thisPtr.OnReceiveRequestCore(result);
205 catch (Exception e)
207 completionException = e;
210 thisPtr.Complete(false, completionException);