2 // System.Web.Services.Protocols.WebClientProtocol.cs
\r
5 // Tim Coleman (tim@timcoleman.com)
\r
7 // Copyright (C) Tim Coleman, 2002
\r
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System.Collections.Specialized;
\r
32 using System.ComponentModel;
\r
35 using System.Threading;
\r
36 using System.Web.Services;
\r
38 namespace System.Web.Services.Protocols {
\r
39 public abstract class WebClientProtocol : Component {
\r
43 string connectionGroupName;
\r
44 ICredentials credentials;
\r
45 bool preAuthenticate;
\r
46 Encoding requestEncoding;
\r
52 // Used by SoapHttpClientProtocol, use this to avoid creating a new Uri on each invocation.
\r
57 // Points to the current request, so we can call Abort() on it
\r
59 WebRequest current_request;
\r
62 static HybridDictionary cache;
\r
64 static HybridDictionary cache {
66 return (HybridDictionary)AppDomain.CurrentDomain.GetData("WebClientProtocol.cache");
69 AppDomain.CurrentDomain.SetData("WebClientProtocol.cache", value);
75 #region Constructors
\r
77 static WebClientProtocol ()
\r
79 cache = new HybridDictionary ();
\r
82 protected WebClientProtocol ()
\r
84 connectionGroupName = String.Empty;
\r
86 preAuthenticate = false;
\r
87 requestEncoding = null;
\r
93 #endregion // Constructors
\r
98 public string ConnectionGroupName {
\r
99 get { return connectionGroupName; }
\r
100 set { connectionGroupName = value; }
\r
103 public ICredentials Credentials {
\r
104 get { return credentials; }
\r
105 set { credentials = value; }
\r
108 [DefaultValue (false)]
\r
109 [WebServicesDescription ("Enables pre authentication of the request.")]
\r
110 public bool PreAuthenticate {
\r
111 get { return preAuthenticate; }
\r
112 set { preAuthenticate = value; }
\r
115 [DefaultValue ("")]
\r
116 [RecommendedAsConfigurable (true)]
\r
117 [WebServicesDescription ("The encoding to use for requests.")]
\r
118 public Encoding RequestEncoding {
\r
119 get { return requestEncoding; }
\r
120 set { requestEncoding = value; }
\r
123 [DefaultValue (100000)]
\r
124 [RecommendedAsConfigurable (true)]
\r
125 [WebServicesDescription ("Sets the timeout in milliseconds to be used for synchronous calls. The default of -1 means infinite.")]
\r
126 public int Timeout {
\r
127 get { return timeout; }
\r
128 set { timeout = value; }
\r
131 [DefaultValue ("")]
\r
132 [RecommendedAsConfigurable (true)]
\r
133 [WebServicesDescription ("The base URL to the server to use for requests.")]
\r
134 public string Url {
\r
135 get { return url; }
\r
138 uri = new Uri (url);
\r
142 #endregion // Properties
\r
146 public virtual void Abort ()
\r
148 if (current_request != null){
\r
149 current_request.Abort ();
\r
150 current_request = null;
\r
155 protected static void AddToCache (Type type, object value)
\r
157 cache [type] = value;
\r
160 protected static object GetFromCache (Type type)
\r
162 return cache [type];
\r
165 protected virtual WebRequest GetWebRequest (Uri uri)
\r
168 throw new InvalidOperationException ("uri is null");
\r
170 current_request = WebRequest.Create (uri);
\r
171 current_request.Timeout = timeout;
\r
172 current_request.PreAuthenticate = preAuthenticate;
\r
173 current_request.ConnectionGroupName = connectionGroupName;
\r
175 if (credentials != null)
\r
176 current_request.Credentials = credentials;
\r
178 return current_request;
\r
181 protected virtual WebResponse GetWebResponse (WebRequest request)
\r
184 throw new WebException ("The operation has been aborted.", WebExceptionStatus.RequestCanceled);
\r
186 WebResponse response = null;
\r
188 request.Timeout = timeout;
\r
189 response = request.GetResponse ();
\r
190 } catch (WebException e) {
\r
191 response = e.Response;
\r
192 if (response == null)
\r
199 protected virtual WebResponse GetWebResponse (WebRequest request, IAsyncResult result)
\r
202 throw new WebException ("The operation has been aborted.", WebExceptionStatus.RequestCanceled);
\r
204 return request.EndGetResponse (result);
\r
207 #endregion // Methods
\r