2 // SilverlightClientConfigLoader.cs
5 // Atsushi Enomoto <atsushi@ximian.com>
7 // Copyright (C) 2009 Novell, Inc. http://www.novell.com
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System.Collections.Generic;
31 using System.ServiceModel.Channels;
35 namespace System.ServiceModel
37 // This class is to read ServiceReference.ClientConfig which is
38 // used to give default settings for ClientBase<T> configuration.
39 // It is only used in Silverlight application.
41 // Since System.Configuration is not supported in SL, this config
42 // loader has to be created without depending on it.
44 internal class SilverlightClientConfigLoader
46 public SilverlightClientConfiguration Load (XmlReader reader)
48 var ret = new SilverlightClientConfiguration ();
49 ret.Bindings = new BindingsConfiguration ();
50 ret.Client = new ClientConfiguration ();
52 reader.MoveToContent ();
53 if (reader.IsEmptyElement)
55 reader.ReadStartElement ("configuration");
57 for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
58 if (reader.NodeType != XmlNodeType.Element ||
59 reader.LocalName != "system.serviceModel" ||
60 reader.IsEmptyElement) {
64 // in <system.serviceModel>
65 reader.ReadStartElement ();
66 for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
67 if (reader.NodeType != XmlNodeType.Element ||
68 reader.IsEmptyElement) {
72 switch (reader.LocalName) {
74 reader.ReadStartElement ();
75 for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
76 if (reader.NodeType != XmlNodeType.Element ||
77 reader.IsEmptyElement) {
81 switch (reader.LocalName) {
83 reader.ReadStartElement ();
84 for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
85 if (reader.NodeType != XmlNodeType.Element ||
86 reader.LocalName != "binding") {
90 ret.Bindings.CustomBinding.Add (ReadCustomBinding (reader));
92 reader.ReadEndElement ();
94 case "basicHttpBinding":
95 reader.ReadStartElement ();
96 for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
97 if (reader.NodeType != XmlNodeType.Element ||
98 reader.LocalName != "binding") {
102 ret.Bindings.BasicHttpBinding.Add (ReadBasicHttpBinding (reader));
104 reader.ReadEndElement ();
108 reader.ReadEndElement ();
111 reader.ReadStartElement ();
112 for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
113 if (reader.NodeType != XmlNodeType.Element ||
114 reader.LocalName != "endpoint") {
118 ret.Client.Endpoints.Add (ReadEndpoint (reader));
120 reader.ReadEndElement ();
124 reader.ReadEndElement ();
125 // out <system.serviceModel>
127 reader.ReadEndElement ();
128 // out <configuration>
133 CustomBindingConfiguration ReadCustomBinding (XmlReader reader)
136 var b = new CustomBindingConfiguration ();
137 if ((a = reader.GetAttribute ("name")) != null)
140 if (!reader.IsEmptyElement) {
141 reader.ReadStartElement ();
142 for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
143 if (reader.NodeType != XmlNodeType.Element) {
147 switch (reader.LocalName) {
148 case "binaryMessageEncoding":
149 b.MessageEncoding = new BinaryMessageEncodingBindingElement ();
152 case "textMessageEncoding":
153 b.MessageEncoding = new TextMessageEncodingBindingElement ();
156 case "httpTransport":
157 b.Transport = new HttpTransportBindingElement ();
160 case "httpsTransport":
161 b.Transport = new HttpsTransportBindingElement ();
165 throw new XmlException (String.Format ("Unexpected configuration element '{0}'", reader.LocalName));
168 reader.ReadEndElement ();
174 BasicHttpBindingConfiguration ReadBasicHttpBinding (XmlReader reader)
177 var b = new BasicHttpBindingConfiguration ();
179 if ((a = reader.GetAttribute ("name")) != null)
181 if ((a = reader.GetAttribute ("maxBufferPoolSize")) != null)
182 b.MaxBufferPoolSize = XmlConvert.ToInt32 (a);
183 if ((a = reader.GetAttribute ("maxBufferSize")) != null)
184 b.MaxBufferSize = XmlConvert.ToInt32 (a);
185 if ((a = reader.GetAttribute ("maxReceivedMessageSize")) != null)
186 b.MaxReceivedMessageSize = XmlConvert.ToInt32 (a);
187 if ((a = reader.GetAttribute ("textEncoding")) != null)
188 b.TextEncoding = Encoding.GetEncoding (a);
190 if (!reader.IsEmptyElement) {
191 reader.ReadStartElement ();
192 for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
193 if (reader.NodeType != XmlNodeType.Element ||
194 reader.LocalName != "security") {
198 if ((a = reader.GetAttribute ("mode")) != null)
199 b.Security.Mode = (BasicHttpSecurityMode) Enum.Parse (typeof (BasicHttpSecurityMode), a, false);
202 reader.ReadEndElement ();
210 EndpointConfiguration ReadEndpoint (XmlReader reader)
213 var e = new EndpointConfiguration ();
215 if ((a = reader.GetAttribute ("name")) != null)
217 if ((a = reader.GetAttribute ("address")) != null)
218 e.Address = new Uri (a);
219 if ((a = reader.GetAttribute ("bindingConfiguration")) != null)
220 e.BindingConfiguration = a;
221 if ((a = reader.GetAttribute ("contract")) != null)
228 public class SilverlightClientConfiguration
230 public SilverlightClientConfiguration ()
234 public BindingsConfiguration Bindings { get; set; }
235 public ClientConfiguration Client { get; set; }
237 public ServiceEndpointConfiguration GetServiceEndpointConfiguration (string name)
239 var s = new ServiceEndpointConfiguration ();
241 EndpointConfiguration e = GetEndpointConfiguration (name);
242 s.Address = new EndpointAddress (e.Address);
243 s.Binding = GetConfiguredHttpBinding (e).CreateBinding ();
247 EndpointConfiguration GetEndpointConfiguration (string name)
249 foreach (var e in Client.Endpoints)
250 if (e.Name == name || name == "*")
252 return Client.Endpoints [0];
255 BindingConfiguration GetConfiguredHttpBinding (EndpointConfiguration endpoint)
257 foreach (var b in Bindings.All ())
258 if (b.Name == endpoint.BindingConfiguration)
260 return Bindings.BasicHttpBinding [0];
264 public class ServiceEndpointConfiguration
266 public string Name { get; set; }
267 public EndpointAddress Address { get; set; }
268 public Binding Binding { get; set; }
271 public class BindingsConfiguration
273 public BindingsConfiguration ()
275 BasicHttpBinding = new List<BasicHttpBindingConfiguration> ();
276 CustomBinding = new List<CustomBindingConfiguration> ();
279 public IList<BasicHttpBindingConfiguration> BasicHttpBinding { get; private set; }
280 public IList<CustomBindingConfiguration> CustomBinding { get; private set; }
282 public IEnumerable<BindingConfiguration> All ()
284 foreach (var b in BasicHttpBinding)
286 foreach (var b in CustomBinding)
291 public abstract class BindingConfiguration
293 public string Name { get; set; }
295 public abstract Binding CreateBinding ();
298 public class BasicHttpBindingConfiguration : BindingConfiguration
300 public BasicHttpBindingConfiguration ()
302 Binding = new BasicHttpBinding ();
303 Security = new BasicHttpSecurityConfiguration (Binding.Security);
306 BasicHttpBinding Binding { get; set; }
308 public override Binding CreateBinding ()
313 public BasicHttpSecurityConfiguration Security { get; private set; }
315 public long MaxBufferPoolSize {
316 get { return Binding.MaxBufferPoolSize; }
317 set { Binding.MaxBufferPoolSize = value; }
319 public int MaxBufferSize {
320 get { return Binding.MaxBufferSize; }
321 set { Binding.MaxBufferSize = value; }
323 public long MaxReceivedMessageSize {
324 get { return Binding.MaxReceivedMessageSize; }
325 set { Binding.MaxReceivedMessageSize = value; }
328 public Encoding TextEncoding {
329 get { return Binding.TextEncoding; }
330 set { Binding.TextEncoding = value; }
333 // public bool AllowCookies { get; set; }
334 // public bool BypassProxyOnLocal { get; set; }
335 // public HostNameComparisonMode HostNameComparisonMode { get; set; }
336 // public WSMessageEncoding MessageEncoding { get; set; }
337 // public Uri ProxyAddress { get; set; }
338 // public XmlDictionaryReaderQuotasElement ReaderQuotas { get; }
339 // public TransferMode TransferMode { get; set; }
340 // public bool UseDefaultWebProxy { get; set; }
343 public class BasicHttpSecurityConfiguration
345 public BasicHttpSecurityConfiguration (BasicHttpSecurity security)
350 public BasicHttpSecurity Security { get; private set; }
352 public BasicHttpSecurityMode Mode {
353 get { return Security.Mode; }
354 set { Security.Mode = value; }
358 public class CustomBindingConfiguration : BindingConfiguration
360 public override Binding CreateBinding ()
362 return new CustomBinding (MessageEncoding, Transport);
365 public MessageEncodingBindingElement MessageEncoding { get; set; }
366 public TransportBindingElement Transport { get; set; }
369 public class ClientConfiguration
371 public ClientConfiguration ()
373 Endpoints = new List<EndpointConfiguration> ();
376 public IList<EndpointConfiguration> Endpoints { get; private set; }
378 // (should be) no metadata element support unlike full WCF.
381 public class EndpointConfiguration
383 public EndpointConfiguration ()
387 public string Name { get; set; }
388 public Uri Address { get; set; }
389 public string BindingConfiguration { get; set; }
390 // public string BehaviorConfiguration { get; set; }
391 public string Contract { get; set; }
392 // public AddressHeaderCollection Headers { get; set; }
393 // public EndpointIdentity Identity { get; set; }