| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- //------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.ServiceModel.Channels
- {
- using System.Collections.Generic;
- using System.Runtime;
- using System.ServiceModel;
- class ReplyChannel : InputQueueChannel<RequestContext>, IReplyChannel
- {
- EndpointAddress localAddress;
- public ReplyChannel(ChannelManagerBase channelManager, EndpointAddress localAddress)
- : base(channelManager)
- {
- this.localAddress = localAddress;
- }
- public EndpointAddress LocalAddress
- {
- get { return localAddress; }
- }
- public override T GetProperty<T>()
- {
- if (typeof(T) == typeof(IReplyChannel))
- {
- return (T)(object)this;
- }
- T baseProperty = base.GetProperty<T>();
- if (baseProperty != null)
- {
- return baseProperty;
- }
- return default(T);
- }
- protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
- {
- return new CompletedAsyncResult(callback, state);
- }
- protected override void OnEndOpen(IAsyncResult result)
- {
- CompletedAsyncResult.End(result);
- }
- protected override void OnOpen(TimeSpan timeout)
- {
- }
- #region static Helpers to convert TryReceiveRequest to ReceiveRequest
- internal static RequestContext HelpReceiveRequest(IReplyChannel channel, TimeSpan timeout)
- {
- RequestContext requestContext;
- if (channel.TryReceiveRequest(timeout, out requestContext))
- {
- return requestContext;
- }
- else
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
- ReplyChannel.CreateReceiveRequestTimedOutException(channel, timeout));
- }
- }
- internal static IAsyncResult HelpBeginReceiveRequest(IReplyChannel channel, TimeSpan timeout, AsyncCallback callback, object state)
- {
- return new HelpReceiveRequestAsyncResult(channel, timeout, callback, state);
- }
- internal static RequestContext HelpEndReceiveRequest(IAsyncResult result)
- {
- return HelpReceiveRequestAsyncResult.End(result);
- }
- class HelpReceiveRequestAsyncResult : AsyncResult
- {
- IReplyChannel channel;
- TimeSpan timeout;
- static AsyncCallback onReceiveRequest = Fx.ThunkCallback(new AsyncCallback(OnReceiveRequest));
- RequestContext requestContext;
- public HelpReceiveRequestAsyncResult(IReplyChannel channel, TimeSpan timeout, AsyncCallback callback, object state)
- : base(callback, state)
- {
- this.channel = channel;
- this.timeout = timeout;
- IAsyncResult result = channel.BeginTryReceiveRequest(timeout, onReceiveRequest, this);
- if (!result.CompletedSynchronously)
- {
- return;
- }
- HandleReceiveRequestComplete(result);
- base.Complete(true);
- }
- public static RequestContext End(IAsyncResult result)
- {
- HelpReceiveRequestAsyncResult thisPtr = AsyncResult.End<HelpReceiveRequestAsyncResult>(result);
- return thisPtr.requestContext;
- }
- void HandleReceiveRequestComplete(IAsyncResult result)
- {
- if (!this.channel.EndTryReceiveRequest(result, out this.requestContext))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
- ReplyChannel.CreateReceiveRequestTimedOutException(this.channel, this.timeout));
- }
- }
- static void OnReceiveRequest(IAsyncResult result)
- {
- if (result.CompletedSynchronously)
- {
- return;
- }
- HelpReceiveRequestAsyncResult thisPtr = (HelpReceiveRequestAsyncResult)result.AsyncState;
- Exception completionException = null;
- try
- {
- thisPtr.HandleReceiveRequestComplete(result);
- }
- #pragma warning suppress 56500 // [....], transferring exception to another thread
- catch (Exception e)
- {
- if (Fx.IsFatal(e))
- {
- throw;
- }
- completionException = e;
- }
- thisPtr.Complete(false, completionException);
- }
- }
- static Exception CreateReceiveRequestTimedOutException(IReplyChannel channel, TimeSpan timeout)
- {
- if (channel.LocalAddress != null)
- {
- return new TimeoutException(SR.GetString(SR.ReceiveRequestTimedOut, channel.LocalAddress.Uri.AbsoluteUri, timeout));
- }
- else
- {
- return new TimeoutException(SR.GetString(SR.ReceiveRequestTimedOutNoLocalAddress, timeout));
- }
- }
- #endregion
- public RequestContext ReceiveRequest()
- {
- return this.ReceiveRequest(this.DefaultReceiveTimeout);
- }
- public RequestContext ReceiveRequest(TimeSpan timeout)
- {
- if (timeout < TimeSpan.Zero)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
- new ArgumentOutOfRangeException("timeout", timeout, SR.GetString(SR.SFxTimeoutOutOfRange0)));
- this.ThrowPending();
- return ReplyChannel.HelpReceiveRequest(this, timeout);
- }
- public IAsyncResult BeginReceiveRequest(AsyncCallback callback, object state)
- {
- return this.BeginReceiveRequest(this.DefaultReceiveTimeout, callback, state);
- }
- public IAsyncResult BeginReceiveRequest(TimeSpan timeout, AsyncCallback callback, object state)
- {
- if (timeout < TimeSpan.Zero)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
- new ArgumentOutOfRangeException("timeout", timeout, SR.GetString(SR.SFxTimeoutOutOfRange0)));
- }
- this.ThrowPending();
- return ReplyChannel.HelpBeginReceiveRequest(this, timeout, callback, state);
- }
- public RequestContext EndReceiveRequest(IAsyncResult result)
- {
- return ReplyChannel.HelpEndReceiveRequest(result);
- }
- public bool TryReceiveRequest(TimeSpan timeout, out RequestContext context)
- {
- if (timeout < TimeSpan.Zero)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
- new ArgumentOutOfRangeException("timeout", timeout, SR.GetString(SR.SFxTimeoutOutOfRange0)));
- this.ThrowPending();
- return base.Dequeue(timeout, out context);
- }
- public IAsyncResult BeginTryReceiveRequest(TimeSpan timeout, AsyncCallback callback, object state)
- {
- if (timeout < TimeSpan.Zero)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
- new ArgumentOutOfRangeException("timeout", timeout, SR.GetString(SR.SFxTimeoutOutOfRange0)));
- this.ThrowPending();
- return base.BeginDequeue(timeout, callback, state);
- }
- public bool EndTryReceiveRequest(IAsyncResult result, out RequestContext context)
- {
- return base.EndDequeue(result, out context);
- }
- public bool WaitForRequest(TimeSpan timeout)
- {
- if (timeout < TimeSpan.Zero)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
- new ArgumentOutOfRangeException("timeout", timeout, SR.GetString(SR.SFxTimeoutOutOfRange0)));
- this.ThrowPending();
- return base.WaitForItem(timeout);
- }
- public IAsyncResult BeginWaitForRequest(TimeSpan timeout, AsyncCallback callback, object state)
- {
- if (timeout < TimeSpan.Zero)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
- new ArgumentOutOfRangeException("timeout", timeout, SR.GetString(SR.SFxTimeoutOutOfRange0)));
- this.ThrowPending();
- return base.BeginWaitForItem(timeout, callback, state);
- }
- public bool EndWaitForRequest(IAsyncResult result)
- {
- return base.EndWaitForItem(result);
- }
- }
- }
|