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 : ChannelBase, 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 protected internal override TimeSpan DefaultCloseTimeout { 54 get { return channel_factory.DefaultCloseTimeout; } 55 } 56 57 protected internal override TimeSpan DefaultOpenTimeout { 58 get { return channel_factory.DefaultOpenTimeout; } 59 } 60 61 public EndpointAddress RemoteAddress { 62 get { return address; } 63 } 64 65 public Uri Via { 66 get { return via ?? RemoteAddress.Uri; } 67 } 68 GetProperty()69 public override T GetProperty<T> () 70 { 71 if (typeof (T) == typeof (MessageVersion) && channel_factory is IHasMessageEncoder) 72 return (T) (object) ((IHasMessageEncoder) channel_factory).MessageEncoder.MessageVersion; 73 if (typeof (T) == typeof (IChannelFactory)) 74 return (T) (object) channel_factory; 75 return base.GetProperty<T> (); 76 } 77 78 // Request 79 Request(Message message)80 public Message Request (Message message) 81 { 82 return Request (message, DefaultSendTimeout); 83 } 84 Request(Message message, TimeSpan timeout)85 public abstract Message Request (Message message, TimeSpan timeout); 86 BeginRequest(Message message, AsyncCallback callback, object state)87 public IAsyncResult BeginRequest (Message message, AsyncCallback callback, object state) 88 { 89 return BeginRequest (message, DefaultSendTimeout, callback, state); 90 } 91 92 Func<Message,TimeSpan,Message> request_delegate; 93 BeginRequest(Message message, TimeSpan timeout, AsyncCallback callback, object state)94 public virtual IAsyncResult BeginRequest (Message message, TimeSpan timeout, AsyncCallback callback, object state) 95 { 96 if (request_delegate == null) 97 request_delegate = new Func<Message,TimeSpan,Message> (Request); 98 return request_delegate.BeginInvoke (message, timeout, callback, state); 99 } 100 EndRequest(IAsyncResult result)101 public virtual Message EndRequest (IAsyncResult result) 102 { 103 return request_delegate.EndInvoke (result); 104 } 105 106 // Open and Close 107 Action<TimeSpan> open_delegate; 108 OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)109 protected override IAsyncResult OnBeginOpen (TimeSpan timeout, AsyncCallback callback, object state) 110 { 111 if (open_delegate == null) 112 open_delegate = new Action<TimeSpan> (OnOpen); 113 return open_delegate.BeginInvoke (timeout, callback, state); 114 } 115 OnEndOpen(IAsyncResult result)116 protected override void OnEndOpen (IAsyncResult result) 117 { 118 open_delegate.EndInvoke (result); 119 } 120 121 Action<TimeSpan> close_delegate; 122 OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state)123 protected override IAsyncResult OnBeginClose (TimeSpan timeout, AsyncCallback callback, object state) 124 { 125 if (close_delegate == null) 126 close_delegate = new Action<TimeSpan> (OnClose); 127 return close_delegate.BeginInvoke (timeout, callback, state); 128 } 129 OnEndClose(IAsyncResult result)130 protected override void OnEndClose (IAsyncResult result) 131 { 132 close_delegate.EndInvoke (result); 133 } 134 } 135 } 136