Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / MsmqIntegration / MsmqIntegrationOutputChannel.cs / 1 / MsmqIntegrationOutputChannel.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.MsmqIntegration { using System.IO; using System.Transactions; using System.IdentityModel.Selectors; using System.ServiceModel; using System.ServiceModel.Security; using System.ServiceModel.Security.Tokens; using System.ServiceModel.Channels; using System.ServiceModel.Diagnostics; sealed class MsmqIntegrationOutputChannel : TransportOutputChannel { MsmqQueue msmqQueue; MsmqTransactionMode transactionMode; MsmqIntegrationChannelFactory factory; SecurityTokenProviderContainer certificateTokenProvider; public MsmqIntegrationOutputChannel(MsmqIntegrationChannelFactory factory, EndpointAddress to, Uri via, bool manualAddressing) : base(factory, to, via, manualAddressing, factory.MessageVersion) { this.factory = factory; if (factory.IsMsmqX509SecurityConfigured) { this.certificateTokenProvider = factory.CreateX509TokenProvider(to, via); } } void CloseQueue() { if (null != this.msmqQueue) this.msmqQueue.Dispose(); this.msmqQueue = null; } void OnCloseCore(bool isAborting, TimeSpan timeout) { this.CloseQueue(); if (this.certificateTokenProvider != null) { if (isAborting) this.certificateTokenProvider.Abort(); else this.certificateTokenProvider.Close(timeout); } } protected override void OnAbort() { this.OnCloseCore(true, TimeSpan.Zero); } protected override IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state) { this.OnCloseCore(false, timeout); return new CompletedAsyncResult(callback, state); } protected override void OnEndClose(IAsyncResult result) { CompletedAsyncResult.End(result); } protected override void OnClose(TimeSpan timeout) { this.OnCloseCore(false, timeout); } void OpenQueue() { try { this.msmqQueue = new MsmqQueue(this.factory.AddressTranslator.UriToFormatName(this.RemoteAddress.Uri), UnsafeNativeMethods.MQ_SEND_ACCESS); } catch (MsmqException ex) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(ex.Normalized); } if (this.factory.ExactlyOnce) { this.transactionMode = MsmqTransactionMode.CurrentOrSingle; } else { this.transactionMode = MsmqTransactionMode.None; } } void OnOpenCore(TimeSpan timeout) { OpenQueue(); if (this.certificateTokenProvider != null) { this.certificateTokenProvider.Open(timeout); } } protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state) { OnOpenCore(timeout); return new CompletedAsyncResult(callback, state); } protected override void OnEndOpen(IAsyncResult result) { CompletedAsyncResult.End(result); } protected override void OnOpen(TimeSpan timeout) { OnOpenCore(timeout); } protected override IAsyncResult OnBeginSend(Message message, TimeSpan timeout, AsyncCallback callback, object state) { OnSend(message, timeout); return new CompletedAsyncResult(callback, state); } protected override void OnEndSend(IAsyncResult result) { CompletedAsyncResult.End(result); } protected override void OnSend(Message message, TimeSpan timeout) { MessageProperties properties = message.Properties; Stream stream = null; MsmqIntegrationMessageProperty property = MsmqIntegrationMessageProperty.Get(message); if (null == property) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new CommunicationException(SR.GetString(SR.MsmqMessageDoesntHaveIntegrationProperty))); if (null != property.Body) stream = this.factory.Serialize(property); int size; if (stream == null) { size = 0; } else { if (stream.Length > int.MaxValue) { throw TraceUtility.ThrowHelperError(new ProtocolException(SR.GetString(SR.MessageSizeMustBeInIntegerRange)), message); } size = (int)stream.Length; } using (MsmqIntegrationOutputMessage msmqMessage = new MsmqIntegrationOutputMessage(this.factory, size, this.RemoteAddress, property)) { msmqMessage.ApplyCertificateIfNeeded(this.certificateTokenProvider, this.factory.MsmqTransportSecurity.MsmqAuthenticationMode, timeout); if (stream != null) { stream.Position = 0; for (int bytesRemaining = size; bytesRemaining > 0; ) { int bytesRead = stream.Read(msmqMessage.Body.Buffer, 0, bytesRemaining); bytesRemaining -= bytesRead; } } bool lockHeld = false; try { Msmq.EnterXPSendLock(out lockHeld, this.factory.MsmqTransportSecurity.MsmqProtectionLevel); this.msmqQueue.Send(msmqMessage, this.transactionMode); MsmqDiagnostics.DatagramSent(msmqMessage.MessageId, message); property.Id = MsmqMessageId.ToString(msmqMessage.MessageId.Buffer); } catch (MsmqException ex) { if (ex.FaultSender) this.Fault(); throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(ex.Normalized); } finally { if (lockHeld) { Msmq.LeaveXPSendLock(); } } } } class MsmqIntegrationOutputMessage : MsmqOutputMessage{ ByteProperty acknowledge; StringProperty adminQueue; IntProperty appSpecific; BufferProperty correlationId; BufferProperty extension; StringProperty label; ByteProperty priority; StringProperty responseQueue; public MsmqIntegrationOutputMessage( MsmqChannelFactoryBase factory, int bodySize, EndpointAddress remoteAddress, MsmqIntegrationMessageProperty property) : base(factory, bodySize, remoteAddress, 8) { if (null == property) { DiagnosticUtility.DebugAssert("MsmqIntegrationMessageProperty expected"); } if (property.AcknowledgeType.HasValue) EnsureAcknowledgeProperty((byte)property.AcknowledgeType.Value); if (null != property.AdministrationQueue) EnsureAdminQueueProperty(property.AdministrationQueue, false); if (property.AppSpecific.HasValue) this.appSpecific = new IntProperty(this, UnsafeNativeMethods.PROPID_M_APPSPECIFIC, property.AppSpecific.Value); if (property.BodyType.HasValue) EnsureBodyTypeProperty(property.BodyType.Value); if (null != property.CorrelationId) this.correlationId = new BufferProperty(this, UnsafeNativeMethods.PROPID_M_CORRELATIONID, MsmqMessageId.FromString(property.CorrelationId)); if (null != property.Extension) this.extension = new BufferProperty(this, UnsafeNativeMethods.PROPID_M_EXTENSION, property.Extension); if (null != property.Label) this.label = new StringProperty(this, UnsafeNativeMethods.PROPID_M_LABEL, property.Label); if (property.Priority.HasValue) this.priority = new ByteProperty(this, UnsafeNativeMethods.PROPID_M_PRIORITY, (byte)property.Priority.Value); if (null != property.ResponseQueue) EnsureResponseQueueProperty(property.ResponseQueue); if (property.TimeToReachQueue.HasValue) EnsureTimeToReachQueueProperty(MsmqDuration.FromTimeSpan(property.TimeToReachQueue.Value)); } void EnsureAcknowledgeProperty(byte value) { if (this.acknowledge == null) { this.acknowledge = new ByteProperty(this, UnsafeNativeMethods.PROPID_M_ACKNOWLEDGE); } this.acknowledge.Value = value; } void EnsureAdminQueueProperty(Uri value, bool useNetMsmqTranslator) { if (null != value) { string queueName = useNetMsmqTranslator ? MsmqUri.NetMsmqAddressTranslator.UriToFormatName(value) : MsmqUri.FormatNameAddressTranslator.UriToFormatName(value); if (this.adminQueue == null) { this.adminQueue = new StringProperty(this, UnsafeNativeMethods.PROPID_M_ADMIN_QUEUE, queueName); } else { this.adminQueue.SetValue(queueName); } } } void EnsureResponseQueueProperty(Uri value) { if (null != value) { string queueName = MsmqUri.FormatNameAddressTranslator.UriToFormatName(value); if (this.responseQueue == null) { this.responseQueue = new StringProperty(this, UnsafeNativeMethods.PROPID_M_RESP_FORMAT_NAME, queueName); } else { this.responseQueue.SetValue(queueName); } } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DataTablePropertyDescriptor.cs
- EmbeddedMailObjectsCollection.cs
- InternalTypeHelper.cs
- UserControlCodeDomTreeGenerator.cs
- VerticalAlignConverter.cs
- Point3D.cs
- ShaperBuffers.cs
- SequenceFullException.cs
- SchemaTableOptionalColumn.cs
- WrappedIUnknown.cs
- SvcMapFileLoader.cs
- DBProviderConfigurationHandler.cs
- SqlUtils.cs
- TransformedBitmap.cs
- RenderingEventArgs.cs
- SizeAnimationClockResource.cs
- ItemPager.cs
- SoapFormatterSinks.cs
- FixedPosition.cs
- SiteMapDataSource.cs
- ColumnCollectionEditor.cs
- TableLayoutPanelResizeGlyph.cs
- RecognizeCompletedEventArgs.cs
- Set.cs
- BulletedList.cs
- RelatedPropertyManager.cs
- WindowInteractionStateTracker.cs
- AspNetHostingPermission.cs
- X509Chain.cs
- WorkflowOperationAsyncResult.cs
- SchemaImporterExtensionElementCollection.cs
- CombinedTcpChannel.cs
- TimeSpanValidator.cs
- PageAdapter.cs
- HtmlElementEventArgs.cs
- XamlSerializerUtil.cs
- CustomErrorCollection.cs
- NamespaceDisplayAutomationPeer.cs
- sqlstateclientmanager.cs
- SqlCacheDependencyDatabaseCollection.cs
- BoundField.cs
- ActivityExecutionFilter.cs
- TransactionChannel.cs
- CompilerCollection.cs
- ObjectReaderCompiler.cs
- ModuleBuilder.cs
- HttpProfileGroupBase.cs
- ToolStripLabel.cs
- OleDbCommandBuilder.cs
- CrossAppDomainChannel.cs
- EntityDataSourceContextCreatingEventArgs.cs
- Scripts.cs
- Task.cs
- MemberCollection.cs
- ToolStripItemClickedEventArgs.cs
- ISAPIApplicationHost.cs
- CodePropertyReferenceExpression.cs
- BezierSegment.cs
- FileLevelControlBuilderAttribute.cs
- HttpCapabilitiesSectionHandler.cs
- XmlQueryCardinality.cs
- ReadOnlyObservableCollection.cs
- SimpleParser.cs
- externdll.cs
- XmlImplementation.cs
- ReadOnlyAttribute.cs
- ManagementQuery.cs
- StateItem.cs
- COAUTHIDENTITY.cs
- SchemaInfo.cs
- Options.cs
- BindableAttribute.cs
- WorkflowEnvironment.cs
- DbFunctionCommandTree.cs
- GroupBoxRenderer.cs
- DrawingAttributesDefaultValueFactory.cs
- DesignerLoader.cs
- TreeIterators.cs
- IListConverters.cs
- DataObjectSettingDataEventArgs.cs
- ExtendedProtectionPolicyElement.cs
- XamlSerializer.cs
- HyperLink.cs
- FastPropertyAccessor.cs
- MenuItem.cs
- BasicAsyncResult.cs
- HttpTransportSecurityElement.cs
- CacheMemory.cs
- BooleanFacetDescriptionElement.cs
- XsltQilFactory.cs
- SafeTimerHandle.cs
- NewExpression.cs
- BackEase.cs
- EntityParameter.cs
- PageSetupDialog.cs
- PropertyAccessVisitor.cs
- DataGridViewCell.cs
- SiteMapSection.cs
- AuthenticationModulesSection.cs
- ActivatedMessageQueue.cs