// // Copyright (c) Microsoft Corporation. All rights reserved. // namespace System.ServiceModel.Channels { using System; using System.Diagnostics; using System.Runtime; using System.ServiceModel; using System.ServiceModel.Diagnostics; internal class UdpRequestContext : RequestContextBase { private NetworkInterfaceMessageProperty networkInterfaceMessageProperty; private UdpOutputChannel outputChannel; private Uri via; public UdpRequestContext(UdpOutputChannel outputChannel, Message requestMessage) : base(requestMessage, outputChannel.InternalCloseTimeout, outputChannel.InternalSendTimeout) { Fx.Assert(outputChannel != null, "replyChannel can't be null"); this.outputChannel = outputChannel; if (!NetworkInterfaceMessageProperty.TryGet(requestMessage, out this.networkInterfaceMessageProperty)) { Fx.Assert("requestMessage must always contain NetworkInterfaceMessageProperty"); } RemoteEndpointMessageProperty remoteEndpointMessageProperty; if (!requestMessage.Properties.TryGetValue(RemoteEndpointMessageProperty.Name, out remoteEndpointMessageProperty)) { Fx.Assert("requestMessage must always contain RemoteEndpointMessageProperty"); } UriBuilder uriBuilder = new UriBuilder(UdpConstants.Scheme, remoteEndpointMessageProperty.Address, remoteEndpointMessageProperty.Port); this.via = uriBuilder.Uri; } protected override void OnAbort() { } protected override IAsyncResult OnBeginReply(Message message, TimeSpan timeout, AsyncCallback callback, object state) { if (message != null) { this.SetAddressingInformation(message); return this.outputChannel.BeginSend(message, timeout, callback, state); } else { return new CompletedAsyncResult(callback, state); } } protected override void OnClose(TimeSpan timeout) { } protected override void OnEndReply(IAsyncResult result) { this.outputChannel.EndSend(result); } protected override void OnReply(Message message, TimeSpan timeout) { if (message != null) { this.SetAddressingInformation(message); this.outputChannel.Send(message, timeout); } } private void SetAddressingInformation(Message message) { this.networkInterfaceMessageProperty.AddTo(message); message.Properties.Via = this.via; } } }