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
- Regex.cs
- Overlapped.cs
- RemoteAsymmetricSignatureFormatter.cs
- ParameterToken.cs
- DataGridViewAutoSizeColumnsModeEventArgs.cs
- WebPartCloseVerb.cs
- MimeTypeMapper.cs
- HttpResponse.cs
- ChainOfResponsibility.cs
- RootAction.cs
- GridViewSortEventArgs.cs
- ValueHandle.cs
- TouchDevice.cs
- StatusBarDrawItemEvent.cs
- PageTheme.cs
- Renderer.cs
- SafeLibraryHandle.cs
- ContextActivityUtils.cs
- FixedTextBuilder.cs
- DirectoryInfo.cs
- GAC.cs
- ColorDialog.cs
- MetadataArtifactLoaderCompositeFile.cs
- PresentationAppDomainManager.cs
- CustomErrorsSection.cs
- TreeNodeMouseHoverEvent.cs
- StringResourceManager.cs
- RepeaterItemCollection.cs
- UserControlParser.cs
- WindowsListViewItem.cs
- MenuDesigner.cs
- CheckBox.cs
- XmlUtilWriter.cs
- ParseChildrenAsPropertiesAttribute.cs
- FixUp.cs
- ThumbButtonInfoCollection.cs
- HttpCachePolicyBase.cs
- Rectangle.cs
- PenContexts.cs
- ExpressionNormalizer.cs
- HtmlEmptyTagControlBuilder.cs
- Unit.cs
- Frame.cs
- LogLogRecord.cs
- WinInetCache.cs
- DbMetaDataCollectionNames.cs
- StorageMappingFragment.cs
- Attributes.cs
- SamlConstants.cs
- WeakEventManager.cs
- FixedTextSelectionProcessor.cs
- PanelDesigner.cs
- FileSystemWatcher.cs
- HwndMouseInputProvider.cs
- CustomErrorsSection.cs
- DataGridViewAutoSizeColumnModeEventArgs.cs
- Viewport3DAutomationPeer.cs
- ScriptMethodAttribute.cs
- RunWorkerCompletedEventArgs.cs
- DataGridItemEventArgs.cs
- Facet.cs
- CompilationLock.cs
- LineSegment.cs
- EventWaitHandle.cs
- DataGridViewCell.cs
- odbcmetadatacollectionnames.cs
- ColumnHeader.cs
- XPathItem.cs
- OlePropertyStructs.cs
- GridViewPageEventArgs.cs
- AuthorizationSection.cs
- ConfigXmlSignificantWhitespace.cs
- ObjectStateManager.cs
- Quaternion.cs
- LinkedDataMemberFieldEditor.cs
- DesignerActionVerbItem.cs
- FlowPosition.cs
- IndicCharClassifier.cs
- SplashScreen.cs
- GenericXmlSecurityTokenAuthenticator.cs
- ViewManagerAttribute.cs
- LinkedList.cs
- TagPrefixAttribute.cs
- QueryExpr.cs
- XamlBrushSerializer.cs
- CellCreator.cs
- XmlSchemaDatatype.cs
- BitmapCacheBrush.cs
- SettingsBase.cs
- Number.cs
- ActionNotSupportedException.cs
- ColorInterpolationModeValidation.cs
- DocumentXmlWriter.cs
- TextEffectCollection.cs
- Transform.cs
- SystemIPv4InterfaceProperties.cs
- SizeChangedEventArgs.cs
- XPathDocumentIterator.cs
- TemplateLookupAction.cs
- FontDialog.cs