2 // Copyright (c) Microsoft Corporation. All Rights Reserved.
4 namespace Microsoft
.ServiceModel
.Samples
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
)
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
,
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
,
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
;
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
)
174 OnReceiveRequestCore(result
);
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
)
199 ReceiveRequestAsyncResult thisPtr
= (ReceiveRequestAsyncResult
)result
.AsyncState
;
200 Exception completionException
= null;
203 thisPtr
.OnReceiveRequestCore(result
);
207 completionException
= e
;
210 thisPtr
.Complete(false, completionException
);