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
- ProjectionPathBuilder.cs
- HtmlInputText.cs
- SelectedPathEditor.cs
- RowUpdatedEventArgs.cs
- HttpsChannelListener.cs
- InkSerializer.cs
- DataGridCellInfo.cs
- IdentityReference.cs
- ButtonRenderer.cs
- XamlFilter.cs
- BoundingRectTracker.cs
- SRGSCompiler.cs
- ListItemConverter.cs
- StaticSiteMapProvider.cs
- FixedDocument.cs
- CompositeActivityMarkupSerializer.cs
- SelectedCellsCollection.cs
- EntityChangedParams.cs
- TableLayoutCellPaintEventArgs.cs
- ResolveMatchesMessageCD1.cs
- MobileControlsSection.cs
- DataKeyCollection.cs
- JsonQNameDataContract.cs
- ObjectListItem.cs
- COM2IVsPerPropertyBrowsingHandler.cs
- CustomAttributeFormatException.cs
- FormClosingEvent.cs
- DataGridTextColumn.cs
- GetWorkflowTree.cs
- DBSqlParserColumnCollection.cs
- AutomationPropertyInfo.cs
- Calendar.cs
- Point3DAnimation.cs
- SegmentInfo.cs
- DesignerFrame.cs
- ConstraintConverter.cs
- ListBindingHelper.cs
- SharedPersonalizationStateInfo.cs
- RegisteredHiddenField.cs
- DataGridViewTopRowAccessibleObject.cs
- EntityDataSourceContextCreatingEventArgs.cs
- RenderTargetBitmap.cs
- ContentTextAutomationPeer.cs
- UnmanagedHandle.cs
- WebScriptMetadataInstanceContextProvider.cs
- UserInitiatedNavigationPermission.cs
- ToolStripTextBox.cs
- CacheForPrimitiveTypes.cs
- objectquery_tresulttype.cs
- CodeSubDirectory.cs
- TemplateEditingFrame.cs
- ListControl.cs
- FragmentQuery.cs
- SystemTcpStatistics.cs
- MdImport.cs
- LinearQuaternionKeyFrame.cs
- HtmlButton.cs
- FloatUtil.cs
- Positioning.cs
- SQLInt64Storage.cs
- Int32Rect.cs
- PageAsyncTaskManager.cs
- DialogWindow.cs
- ImageSourceValueSerializer.cs
- FormsAuthenticationConfiguration.cs
- PrintPreviewGraphics.cs
- DrawToolTipEventArgs.cs
- DeferredTextReference.cs
- ScriptResourceDefinition.cs
- HitTestFilterBehavior.cs
- ObjectPersistData.cs
- Selector.cs
- TrackingProfile.cs
- complextypematerializer.cs
- PartialTrustVisibleAssembliesSection.cs
- WinEventWrap.cs
- WindowsListViewItem.cs
- DbConnectionOptions.cs
- ObjectListComponentEditor.cs
- FieldReference.cs
- HttpAsyncResult.cs
- DragStartedEventArgs.cs
- ModelFunctionTypeElement.cs
- InputLangChangeRequestEvent.cs
- ToolStripDropTargetManager.cs
- SiteMapProvider.cs
- Metadata.cs
- HybridWebProxyFinder.cs
- TransformerConfigurationWizardBase.cs
- ThreadAbortException.cs
- XmlSchemaValidator.cs
- KoreanCalendar.cs
- PointIndependentAnimationStorage.cs
- IsolatedStorageFileStream.cs
- VerticalAlignConverter.cs
- ColorTranslator.cs
- WebZone.cs
- XmlFormatReaderGenerator.cs
- UiaCoreTypesApi.cs
- WindowsListViewGroup.cs