Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.ServiceModel.Activities / System / ServiceModel / Activities / ToReply.cs / 1305376 / ToReply.cs
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //--------------------------------------------------------------- namespace System.ServiceModel.Activities { using System.Activities; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Globalization; using System.Runtime; using System.ServiceModel.Channels; using System.ServiceModel.Dispatcher; using SR2 = System.ServiceModel.Activities.SR; class ToReply : NativeActivity { IDispatchMessageFormatter formatter; IDispatchFaultFormatter faultFormatter; Collectionparameters; public IDispatchMessageFormatter Formatter { get { return this.formatter; } set { this.formatter = value; ValidateFormatters(); } } public IDispatchFaultFormatter FaultFormatter { get { return this.faultFormatter; } set { this.faultFormatter = value; ValidateFormatters(); } } public bool IncludeExceptionDetailInFaults { get; set; } public InArgument Result { get; set; } public Collection Parameters { get { if (this.parameters == null) { this.parameters = new Collection (); } return this.parameters; } } //CorrelationHandle is required to get the message version from the InternalReceivedMessage public InArgument CorrelatesWith { get; set; } public OutArgument Message { get; set; } protected override void CacheMetadata(NativeActivityMetadata metadata) { if (this.Result != null) { RuntimeArgument resultArgument = new RuntimeArgument(Constants.Result, this.Result.ArgumentType, ArgumentDirection.In); metadata.Bind(this.Result, resultArgument); metadata.AddArgument(resultArgument); } if (this.parameters != null) { int count = 0; foreach (InArgument parameter in this.parameters) { RuntimeArgument parameterArgument = new RuntimeArgument(Constants.Parameter + count++, parameter.ArgumentType, ArgumentDirection.In); metadata.Bind(parameter, parameterArgument); metadata.AddArgument(parameterArgument); } } RuntimeArgument messageArgument = new RuntimeArgument(Constants.Message, Constants.MessageType, ArgumentDirection.Out, true); metadata.Bind(this.Message, messageArgument); metadata.AddArgument(messageArgument); RuntimeArgument correlatesWithArgument = new RuntimeArgument(Constants.CorrelatesWith, Constants.CorrelationHandleType, ArgumentDirection.In); metadata.Bind(this.CorrelatesWith, correlatesWithArgument); metadata.AddArgument(correlatesWithArgument); } protected override void Execute(NativeActivityContext context) { CorrelationHandle correlatesWith = (this.CorrelatesWith == null) ? null : this.CorrelatesWith.Get(context); if (correlatesWith == null) { correlatesWith = context.Properties.Find(CorrelationHandle.StaticExecutionPropertyName) as CorrelationHandle; } CorrelationResponseContext responseContext; if (correlatesWith == null || !correlatesWith.TryAcquireResponseContext(context, out responseContext)) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR2.CorrelationResponseContextShouldNotBeNull)); } //Register the ResponseContext so that InternalSendMessage can access it. if (!correlatesWith.TryRegisterResponseContext(context, responseContext)) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR2.ResponseContextIsNotNull)); } Fx.Assert((this.Formatter == null && this.FaultFormatter != null) || (this.Formatter != null && this.FaultFormatter == null), "OperationFormatter and FaultFormatter cannot be both null or both set!"); //Use the same MessageVersion as the incoming message that is retrieved using CorrelatonHandle MessageVersion version = responseContext.MessageVersion; if (this.FaultFormatter != null) { Fx.Assert(this.parameters.Count == 1, "Exception should be the only parameter!"); Exception exception = this.parameters[0].Get(context) as Exception; Fx.Assert(exception != null, "InArgument must be an Exception!"); MessageFault messageFault; string action; FaultException faultException = exception as FaultException; if (faultException != null) { // This is an expected fault // Reproduce logic from ErrorBehavior.InitializeFault messageFault = this.FaultFormatter.Serialize(faultException, out action); if (action == null) { action = version.Addressing.DefaultFaultAction; } } else { // This is an unexpected fault // Reproduce logic from ErrorBehavior.ProvideFaultOfLastResort FaultCode code = new FaultCode(FaultCodeConstants.Codes.InternalServiceFault, FaultCodeConstants.Namespaces.NetDispatch); code = FaultCode.CreateReceiverFaultCode(code); action = FaultCodeConstants.Actions.NetDispatcher; if (this.IncludeExceptionDetailInFaults) { messageFault = MessageFault.CreateFault(code, new FaultReason(new FaultReasonText(exception.Message, CultureInfo.CurrentCulture)), new ExceptionDetail(exception)); } else { messageFault = MessageFault.CreateFault(code, new FaultReason(new FaultReasonText(SR2.InternalServerError, CultureInfo.CurrentCulture))); } } if (messageFault == null) { throw FxTrace.Exception.AsError(new InvalidOperationException(SR2.CannotCreateMessageFault)); } else { Message outMessage = System.ServiceModel.Channels.Message.CreateMessage(version, messageFault, action); this.Message.Set(context, outMessage); } } else { object[] inObjects; if (this.parameters != null) { inObjects = new object[this.parameters.Count]; for (int i = 0; i < this.parameters.Count; i++) { Fx.Assert(this.Parameters[i] != null, "Parameter cannot be null"); inObjects[i] = this.parameters[i].Get(context); } } else { inObjects = Constants.EmptyArray; } object returnValue = null; if (this.Result != null) { returnValue = this.Result.Get(context); } Message outMessage = this.Formatter.SerializeReply(version, inObjects, returnValue); this.Message.Set(context, outMessage); } } void ValidateFormatters() { if (this.Formatter == null && this.FaultFormatter == null) { throw FxTrace.Exception.AsError(new ValidationException(SR2.OperationFormatterAndFaultFormatterNotSet)); } if (this.Formatter != null && this.FaultFormatter != null) { throw FxTrace.Exception.AsError(new ValidationException(SR2.OperationFormatterAndFaultFormatterIncorrectlySet)); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PreservationFileReader.cs
- PerformanceCounterPermissionAttribute.cs
- CanExecuteRoutedEventArgs.cs
- TypeConverterHelper.cs
- BrowserCapabilitiesFactory.cs
- ListViewItem.cs
- Listbox.cs
- AxDesigner.cs
- BooleanKeyFrameCollection.cs
- UDPClient.cs
- SystemIcmpV6Statistics.cs
- Constants.cs
- ApplicationFileParser.cs
- httpserverutility.cs
- WaitHandle.cs
- KeyGestureConverter.cs
- CatalogPart.cs
- MetadataArtifactLoaderFile.cs
- JsonDeserializer.cs
- MethodMessage.cs
- EntityDescriptor.cs
- SecurityDocument.cs
- ProcessHost.cs
- QilExpression.cs
- ResXResourceSet.cs
- DataBindingCollection.cs
- HScrollProperties.cs
- Animatable.cs
- BackStopAuthenticationModule.cs
- TextReader.cs
- ComplusTypeValidator.cs
- ServiceThrottlingElement.cs
- HealthMonitoringSection.cs
- DynamicQueryableWrapper.cs
- TypeDependencyAttribute.cs
- DomainUpDown.cs
- FileNotFoundException.cs
- ToolStripProgressBar.cs
- AuthenticatingEventArgs.cs
- DataGridViewTextBoxCell.cs
- WsdlBuildProvider.cs
- EnumCodeDomSerializer.cs
- QuotedStringWriteStateInfo.cs
- OdbcFactory.cs
- ResourceDefaultValueAttribute.cs
- ProgressBarBrushConverter.cs
- Preprocessor.cs
- BulletedListDesigner.cs
- QueryContinueDragEventArgs.cs
- CustomGrammar.cs
- EventRoute.cs
- StickyNoteHelper.cs
- ObjectResult.cs
- DeviceFilterDictionary.cs
- WmlLiteralTextAdapter.cs
- StatusBarItem.cs
- XmlDictionaryReader.cs
- XmlPropertyBag.cs
- WebPartTransformerCollection.cs
- ColumnMapProcessor.cs
- PropertyPushdownHelper.cs
- BufferAllocator.cs
- XmlDataSourceNodeDescriptor.cs
- PropertyTabChangedEvent.cs
- ExpressionPrefixAttribute.cs
- TypeInitializationException.cs
- RegisteredScript.cs
- MembershipSection.cs
- ToolStripButton.cs
- GlobalItem.cs
- NetworkInformationPermission.cs
- FormatterConverter.cs
- SafeFileMappingHandle.cs
- SchemaNotation.cs
- SchemaSetCompiler.cs
- SqlMethodCallConverter.cs
- ComponentChangedEvent.cs
- unitconverter.cs
- Thumb.cs
- VersionedStream.cs
- PolyQuadraticBezierSegment.cs
- UpdateProgress.cs
- TableChangeProcessor.cs
- ConfigurationConverterBase.cs
- UnsafePeerToPeerMethods.cs
- SafeFileMappingHandle.cs
- Highlights.cs
- CompilerTypeWithParams.cs
- DragDropManager.cs
- DynamicILGenerator.cs
- CreateWorkflowOwnerCommand.cs
- NegotiationTokenAuthenticatorState.cs
- InputElement.cs
- ReservationNotFoundException.cs
- SqlNotificationEventArgs.cs
- AsyncContentLoadedEventArgs.cs
- HttpContextWrapper.cs
- RSAPKCS1KeyExchangeDeformatter.cs
- TypeBuilderInstantiation.cs
- CodeTypeMember.cs