annotate Demo/WebServices/Client/WebClient/WebClientBase.cs @ 4:f757da6161a1

!bug 100 + 2h fixed gregression
author cin
date Sun, 24 Aug 2014 17:57:42 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Diagnostics;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Net;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Web.Services;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Web.Services.Protocols;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Common;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 namespace Demo.WebServices.Client.WebClient
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 [DebuggerStepThrough]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 [System.ComponentModel.DesignerCategory("Code")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 [WebClient]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 public abstract class WebClientBase: SoapHttpClientProtocol
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 /// Initializes a new instance of the <see cref="WebClientBase"/> class.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 protected WebClientBase()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 if (DefaultCredentials == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 UseDefaultCredentials = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 Credentials = DefaultCredentials;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 // Use custom redirection since we need to repost some data.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 AllowAutoRedirect = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 EnableDecompression = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 PreAuthenticate = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 // Setup appropriate user agent string.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 var asm = Assembly.GetEntryAssembly();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 if (asm != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 UserAgent = asm.FullName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 // By default the timeout value is about 2 minutes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 // wich is quite enought in a normal run,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 // but not for debugging.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 Timeout = Int32.MaxValue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 if (string.IsNullOrEmpty(BaseUrl))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 var attr = (WebServiceBindingAttribute)Attribute.GetCustomAttribute(GetType(), typeof(WebServiceBindingAttribute));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 if (attr == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 throw new InvalidOperationException("Please specify relative url or mark the avatar with WebServiceBindingAttribute");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 var ns = attr.Namespace;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 if (string.IsNullOrEmpty(ns))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 throw new InvalidOperationException("Please specify namespace in WebServiceBindingAttribute");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 if (ns.EndsWith("/"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 ns = ns.Substring(0, ns.Length - 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 var builder = new UriBuilder(BaseUrl) { Path = new UriBuilder(ns).Path };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 Url = builder.Uri.AbsoluteUri;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 /// Initializes a new instance of the <see cref="WebClientBase"/> class.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 /// <param name="relativeUrl">Path to web service, relative to <see cref="BaseUrl"/>.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 protected WebClientBase(string relativeUrl) : this()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 Debug.Assert(Url == BaseUrl + relativeUrl, string.Format("Expected url '{0}' got '{1}'", Url, BaseUrl + relativeUrl) );
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 Url = BaseUrl + relativeUrl;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 public static ICredentials DefaultCredentials { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 /// Customizable url path.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 public static string BaseUrl { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 /// Returns <see langword="true"/>, program runs in offline mode.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 public static bool OffLine
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 get { return string.IsNullOrEmpty(BaseUrl); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 #region Invoke
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 private object[] InvokeInternal(string methodName, object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 object[] ret = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 for (;;)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 var sw = Stopwatch.StartNew();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 ret = base.Invoke(methodName, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 Debug.WriteLineIf(TS.TraceVerbose,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 string.Format("Sync call {0}/{1} = {2} msec.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 Url, methodName, sw.ElapsedMilliseconds), TS.DisplayName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 catch (Exception ex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 if (ex is WebException)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 var webException = (WebException) ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 if (webException.Status == WebExceptionStatus.RequestCanceled)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 OnWebOperationCancelled(methodName, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 // Internal redirection
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 if (webException.Status == WebExceptionStatus.ReceiveFailure)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 if (OnWebOperationException(methodName, parameters, ex))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 return AcceptChanges(ret);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 /// Invokes a web method synchronously.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 /// <param name="methodName">Web method name.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 /// <param name="parameters">Web method parameters.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 /// <returns>Web method return value or values on success,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 /// a null reference otherwise.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 public new object[] Invoke(string methodName, params object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 return InvokeInternal(methodName, parameters) ?? new object[]{ null };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 /// Invokes a web method synchronously.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 /// <param name="methodName">Web method name.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 /// <param name="parameters">Web method parameters.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 /// <returns>Web method return value or default(T) if the call fails.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 public T Invoke<T>(string methodName, params object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 var ret = InvokeInternal(methodName, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 return ret != null && ret.Length != 0? (T)ret[0]: default(T);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 /// Invokes a web method asynchronously.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 /// <param name="methodName">Web method name.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 /// <param name="asyncCallState">Call state handle.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 /// Upon return, may be used to cancel the call</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 /// <param name="parameters">Web method parameters.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 /// <param name="callback">Callback method to process the result.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 /// <param name="exceptionHandler">Fail handler.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 /// <seealso cref="CancelAsync(AsyncCallState)"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 public void InvokeAsync(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 string methodName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 AsyncCallState asyncCallState,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 Action<Exception> exceptionHandler,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 Delegate callback,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 params object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 var sw = Stopwatch.StartNew();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 if (asyncCallState != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 Debug.WriteLineIf(TS.TraceVerbose && asyncCallState.PendingCall != null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 string.Format("Cancelling async call {0}/{1}",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 Url, methodName), TS.DisplayName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 CancelAsync(asyncCallState);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 var exceptionCallback = exceptionHandler ?? delegate(Exception ex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 if (ex is WebException)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 var webException = (WebException)ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 // Request cancelled.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 if (webException.Status == WebExceptionStatus.RequestCanceled)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 OnWebOperationCancelled(methodName, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 // Check for retry.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 if (OnWebOperationException(methodName, parameters, ex))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 InvokeAsync(methodName, asyncCallState, exceptionHandler, callback, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 System.Threading.SendOrPostCallback sendCallback = delegate(object obj)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 Debug.WriteLineIf(TS.TraceVerbose,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 string.Format("Async call {0}/{1} = {2} msec.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 Url, methodName, sw.ElapsedMilliseconds), TS.DisplayName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 var ea = (InvokeCompletedEventArgs)obj;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 if (ea.Error != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 // Internal redirection
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 if (ea.Error is WebException && ((WebException)ea.Error).Status == WebExceptionStatus.ReceiveFailure)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 InvokeAsync(methodName, asyncCallState, exceptionHandler, callback, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 exceptionCallback(ea.Error);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 else if (ea.Cancelled || (asyncCallState != null && ea.UserState != asyncCallState.PendingCall))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 exceptionCallback(new WebException(methodName, WebExceptionStatus.RequestCanceled));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 callback.DynamicInvoke(AcceptChanges(ea.Results));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 if (asyncCallState != null && ea.UserState == asyncCallState.PendingCall)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 asyncCallState.PendingCall = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 object cookie = new CompoundValue(methodName, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 if (asyncCallState!= null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 asyncCallState.PendingCall = cookie;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 InvokeAsync(methodName, parameters, sendCallback, cookie);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 /// Invokes a web method asynchronously.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 /// <param name="methodName">Web method name.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 /// <param name="asyncCallState">Call state handle.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 /// Upon return, may be used to cancel the call</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 /// <param name="parameters">Web method parameters.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 /// <param name="callback">Callback method to process the result.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 /// <seealso cref="CancelAsync(AsyncCallState)"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 public void InvokeAsync(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 string methodName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 AsyncCallState asyncCallState,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 Delegate callback,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 params object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 InvokeAsync(methodName, asyncCallState, null, callback, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 private static void AcceptChanges(object obj)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 if (obj == null || obj is IConvertible)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 // Do nothing on bool, int, string, etc.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 else if (obj is BLToolkit.EditableObjects.IEditable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 ((BLToolkit.EditableObjects.IEditable)obj).AcceptChanges();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 else if (obj is System.Collections.IDictionary)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 foreach (System.Collections.DictionaryEntry pair in (System.Collections.IDictionary)obj)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 AcceptChanges(pair.Key);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 AcceptChanges(pair.Value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 else if (obj is System.Collections.IEnumerable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 foreach (var elm in (System.Collections.IEnumerable)obj)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 AcceptChanges(elm);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 private static object[] AcceptChanges(object[] array)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 if (array != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 Array.ForEach(array, AcceptChanges);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 return array;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 ///.Cancel an asynchronous call if it is not completed already.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 /// <param name="asyncCallState">Async call state.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 public void CancelAsync(AsyncCallState asyncCallState)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 if (asyncCallState.PendingCall == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 CancelAsync(asyncCallState.PendingCall);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 asyncCallState.PendingCall = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 #region Events
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 private static readonly object EventWebOperationCancelled = new object();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 public event EventHandler<WebOperationCancelledEventArgs> WebOperationCancelled
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 add { Events.AddHandler (EventWebOperationCancelled, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 remove { Events.RemoveHandler(EventWebOperationCancelled, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 public static event EventHandler<WebOperationCancelledEventArgs> WebOperationCancelledDefaultHandler;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 protected virtual void OnWebOperationCancelled(string methodName, params object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 Debug.WriteLineIf(TS.TraceInfo, string.Format("OnWebOperationCancelled; op={0}/{1}", Url, methodName));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 var handler = (EventHandler<WebOperationCancelledEventArgs>)Events[EventWebOperationCancelled] ?? WebOperationCancelledDefaultHandler;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 if (handler != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 var ea = new WebOperationCancelledEventArgs(Url, methodName, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 handler(this, ea);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 private static readonly object EventWebOperationException = new object();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 public event EventHandler<WebOperationExceptionEventArgs> WebOperationException
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 add { Events.AddHandler (EventWebOperationException, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 remove { Events.RemoveHandler(EventWebOperationException, value); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 public static event EventHandler<WebOperationExceptionEventArgs> WebOperationExceptionDefaultHandler;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 protected virtual bool OnWebOperationException(string methodName, object[] parameters, Exception ex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 Debug.WriteLineIf(TS.TraceError, string.Format("OnWebOperationException; op={0}/{1}; ex={2}", Url, methodName, ex));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 var handler = (EventHandler<WebOperationExceptionEventArgs>)Events[EventWebOperationException] ?? WebOperationExceptionDefaultHandler;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 if (handler != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 var ea = new WebOperationExceptionEventArgs(Url, methodName, parameters, ex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 handler(this, ea);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 return ea.Retry;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 throw new TargetInvocationException(methodName, ex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 #region Cookies
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 private string _cookie;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 /// Creates a <see cref="T:System.Net.WebRequest"/> for the specified uri.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 /// <returns> The <see cref="T:System.Net.WebRequest"/>. </returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 /// <param name="uri">The <see cref="T:System.Uri"></see> to use when creating the <see cref="T:System.Net.WebRequest"></see>. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 /// <exception cref="T:System.InvalidOperationException">The uri parameter is null. </exception>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 protected override WebRequest GetWebRequest(Uri uri)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 var webRequest = base.GetWebRequest(uri);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 PrepareRequest(webRequest);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 return webRequest;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 /// Returns a response from a synchronous request to an XML Web service method.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 /// <returns> The <see cref="T:System.Net.WebResponse"/>. </returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 /// <param name="request">The <see cref="T:System.Net.WebRequest"/>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 /// from which to get the response. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 protected override WebResponse GetWebResponse(WebRequest request)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 var response = (HttpWebResponse)base.GetWebResponse(request);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 ProcessResponse(response);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 return response;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 /// Returns a response from an asynchronous request to an XML Web service method.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 /// <returns> The <see cref="T:System.Net.WebResponse"/>.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 /// <param name="result">The <see cref="T:System.IAsyncResult"/> to pass to
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 /// <see cref="M:System.Net.HttpWebRequest.EndGetResponse(System.IAsyncResult)"/> when the response has completed. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 /// <param name="request">The <see cref="T:System.Net.WebRequest"/> from which to get the response. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 var response = (HttpWebResponse)base.GetWebResponse(request, result);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 ProcessResponse(response);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 return response;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 private void ProcessResponse(HttpWebResponse response)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424 if (response.StatusCode == HttpStatusCode.MovedPermanently)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 var redirectedLocation = response.Headers["Location"];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 Url = new Uri(new Uri(Url), redirectedLocation).AbsoluteUri;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 throw new WebException(redirectedLocation, WebExceptionStatus.ReceiveFailure);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431 var cookies = response.Headers.GetValues("Set-Cookie");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433 if (cookies == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 foreach (var cookie in cookies)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 if (cookie.StartsWith("ASP.NET_SessionId=", StringComparison.Ordinal))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440 _cookie = cookie;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 private void PrepareRequest(WebRequest request)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448 if (!string.IsNullOrEmpty(_cookie))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449 request.Headers.Add("Cookie", _cookie);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454 #region Debug
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456 private static TraceSwitch _ts;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 internal static TraceSwitch TS
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 get { return _ts ?? (_ts = new TraceSwitch("WebServiceClient", "Web service client trace switch")); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 }