// TODO: Make async internal void CloseChannel() { if ((Channel != null) && Channel.HasSession) { try { var helper = new TimeoutHelper(ChannelHandler.CloseAfterFaultTimeout); Channel.CloseAsync(helper.GetCancellationToken()).GetAwaiter().GetResult(); } catch (Exception e) { if (Fx.IsFatal(e)) { throw; } channelHandler.HandleError(e); } } }
Task ICommunicationObject.CloseAsync() { return(_serviceChannel.CloseAsync()); }
public object Invoke(object instance, object[] inputs, out object[] outputs) { outputs = EmptyArray <object> .Allocate(0); Message message = inputs[0] as Message; if (message == null) { return(null); } string action = message.Headers.Action; //if (DiagnosticUtility.ShouldTraceInformation) //{ // TraceUtility.TraceEvent(TraceEventType.Information, TraceCode.UnhandledAction, // SR.TraceCodeUnhandledAction, // new StringTraceRecord("Action", action), // this, null, message); //} FaultCode code = FaultCode.CreateSenderFaultCode(AddressingStrings.ActionNotSupported, message.Version.Addressing.Namespace); string reasonText = SR.Format(SR.SFxNoEndpointMatchingContract, action); FaultReason reason = new FaultReason(reasonText); FaultException exception = new FaultException(reason, code); ErrorBehavior.ThrowAndCatch(exception); ServiceChannel serviceChannel = OperationContext.Current.InternalServiceChannel; OperationContext.Current.OperationCompleted += delegate(object sender, EventArgs e) { ChannelDispatcher channelDispatcher = dispatchRuntime.ChannelDispatcher; if (!channelDispatcher.HandleError(exception) && serviceChannel.HasSession) { try { var helper = new TimeoutHelper(ChannelHandler.CloseAfterFaultTimeout); serviceChannel.CloseAsync(helper.GetCancellationToken()).GetAwaiter().GetResult(); } catch (Exception ex) { if (Fx.IsFatal(ex)) { throw; } channelDispatcher.HandleError(ex); } } }; if (dispatchRuntime.shared.EnableFaults) { MessageFault fault = MessageFault.CreateFault(code, reason, action); return(Message.CreateMessage(message.Version, fault, message.Version.Addressing.DefaultFaultAction)); } else { OperationContext.Current.RequestContext.CloseAsync().GetAwaiter().GetResult(); OperationContext.Current.RequestContext = null; return(null); } }