1 // 2 // RequestChannelBase.cs 3 // 4 // Author: 5 // Atsushi Enomoto <atsushi@ximian.com> 6 // 7 // Copyright (C) 2006 Novell, Inc. http://www.novell.com 8 // 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: 16 // 17 // The above copyright notice and this permission notice shall be 18 // included in all copies or substantial portions of the Software. 19 // 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. 27 // 28 using System; 29 using System.Collections.Generic; 30 using System.IO; 31 using System.Net; 32 using System.Net.Security; 33 using System.ServiceModel; 34 using System.ServiceModel.Description; 35 using System.ServiceModel.Security; 36 37 namespace System.ServiceModel.Channels 38 { 39 internal abstract class RequestChannelBase : DiscoveryChannelBase, IRequestChannel 40 { 41 ChannelFactoryBase channel_factory; 42 EndpointAddress address; 43 Uri via; 44 RequestChannelBase(ChannelFactoryBase factory, EndpointAddress address, Uri via)45 public RequestChannelBase (ChannelFactoryBase factory, EndpointAddress address, Uri via) 46 : base (factory) 47 { 48 this.channel_factory = factory; 49 this.address = address; 50 this.via = via; 51 } 52 53 public EndpointAddress RemoteAddress { 54 get { return address; } 55 } 56 57 public Uri Via { 58 get { return via ?? RemoteAddress.Uri; } 59 } 60 GetProperty()61 public override T GetProperty<T> () 62 { 63 if (typeof (T) == typeof (MessageVersion) && channel_factory is IHasMessageEncoder) 64 return (T) (object) ((IHasMessageEncoder) channel_factory).MessageEncoder.MessageVersion; 65 if (typeof (T) == typeof (IChannelFactory)) 66 return (T) (object) channel_factory; 67 return base.GetProperty<T> (); 68 } 69 70 // Request 71 Request(Message message)72 public Message Request (Message message) 73 { 74 return Request (message, DefaultSendTimeout); 75 } 76 Request(Message message, TimeSpan timeout)77 public abstract Message Request (Message message, TimeSpan timeout); 78 BeginRequest(Message message, AsyncCallback callback, object state)79 public IAsyncResult BeginRequest (Message message, AsyncCallback callback, object state) 80 { 81 return BeginRequest (message, DefaultSendTimeout, callback, state); 82 } 83 84 Func<Message,TimeSpan,Message> request_delegate; 85 BeginRequest(Message message, TimeSpan timeout, AsyncCallback callback, object state)86 public virtual IAsyncResult BeginRequest (Message message, TimeSpan timeout, AsyncCallback callback, object state) 87 { 88 if (request_delegate == null) 89 request_delegate = new Func<Message,TimeSpan,Message> (Request); 90 return request_delegate.BeginInvoke (message, timeout, callback, state); 91 } 92 EndRequest(IAsyncResult result)93 public virtual Message EndRequest (IAsyncResult result) 94 { 95 return request_delegate.EndInvoke (result); 96 } 97 98 // Open and Close 99 Action<TimeSpan> open_delegate; 100 OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)101 protected override IAsyncResult OnBeginOpen (TimeSpan timeout, AsyncCallback callback, object state) 102 { 103 if (open_delegate == null) 104 open_delegate = new Action<TimeSpan> (OnOpen); 105 return open_delegate.BeginInvoke (timeout, callback, state); 106 } 107 OnEndOpen(IAsyncResult result)108 protected override void OnEndOpen (IAsyncResult result) 109 { 110 open_delegate.EndInvoke (result); 111 } 112 113 Action<TimeSpan> close_delegate; 114 OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state)115 protected override IAsyncResult OnBeginClose (TimeSpan timeout, AsyncCallback callback, object state) 116 { 117 if (close_delegate == null) 118 close_delegate = new Action<TimeSpan> (OnClose); 119 return close_delegate.BeginInvoke (timeout, callback, state); 120 } 121 OnEndClose(IAsyncResult result)122 protected override void OnEndClose (IAsyncResult result) 123 { 124 close_delegate.EndInvoke (result); 125 } 126 } 127 } 128