5 // Ankit Jain <jankit@novell.com>
6 // Atsushi Enomoto <atsushi@ximian.com>
8 // Copyright (C) 2006,2009 Novell, Inc. http://www.novell.com
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System.Collections.Generic;
33 using System.Threading;
35 using System.ServiceModel;
36 using System.ServiceModel.Activation;
37 using System.ServiceModel.Configuration;
38 using System.ServiceModel.Description;
40 namespace System.ServiceModel.Channels {
42 internal class SvcHttpHandler : IHttpHandler
49 Queue<HttpContext> pending = new Queue<HttpContext> ();
52 AutoResetEvent process_request_wait = new AutoResetEvent (false);
53 AutoResetEvent listening = new AutoResetEvent (false);
55 public SvcHttpHandler (Type type, Type factoryType, string path)
58 this.factory_type = factoryType;
62 public bool IsReusable
67 public ServiceHostBase Host {
71 public HttpContext WaitForRequest (TimeSpan timeout)
75 DateTime start = DateTime.Now;
79 if (pending.Count == 0) {
80 if (!process_request_wait.WaitOne (timeout - (DateTime.Now - start), false) || close_state > 0)
85 if (pending.Count == 0)
87 ctx = pending.Dequeue ();
89 if (ctx.AllErrors != null && ctx.AllErrors.Length > 0)
90 return WaitForRequest (timeout - (DateTime.Now - start));
94 public void ProcessRequest (HttpContext context)
96 request_url = context.Request.Url;
98 pending.Enqueue (context);
99 process_request_wait.Set ();
101 if (close_state == 0)
102 listening.WaitOne ();
105 public void EndRequest (HttpContext context)
110 // called from SvcHttpHandlerFactory's remove callback (i.e.
111 // unloading asp.net). It closes ServiceHost, then the host
112 // in turn closes the listener and the channels it opened.
113 // The channel listener calls CloseServiceChannel() to stop
114 // accepting further requests on its shutdown.
121 // called from AspNetChannelListener.Close() or .Abort().
122 public void CloseServiceChannel ()
127 process_request_wait.Set ();
132 void EnsureServiceHost ()
137 //ServiceHost for this not created yet
138 var baseUri = new Uri (HttpContext.Current.Request.Url.GetLeftPart (UriPartial.Path));
139 if (factory_type != null) {
140 host = ((ServiceHostFactory) Activator.CreateInstance (factory_type)).CreateServiceHost (type, new Uri [] {baseUri});
143 host = new ServiceHost (type, baseUri);
144 host.Extensions.Add (new VirtualPathExtension (baseUri.AbsolutePath));