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
- ActivityExecutionWorkItem.cs
- DockProviderWrapper.cs
- UnsafeNativeMethods.cs
- FixedLineResult.cs
- DataFormat.cs
- DecoderNLS.cs
- HttpsTransportBindingElement.cs
- ModulesEntry.cs
- ObjectItemNoOpAssemblyLoader.cs
- ConnectionManager.cs
- ByteStreamMessageUtility.cs
- SocketElement.cs
- CodeDOMProvider.cs
- CodeMemberEvent.cs
- LogicalExpressionTypeConverter.cs
- RequestResizeEvent.cs
- DataGridViewCellFormattingEventArgs.cs
- Binding.cs
- TrailingSpaceComparer.cs
- Parser.cs
- DataGridViewComboBoxEditingControl.cs
- HatchBrush.cs
- TypeBuilder.cs
- OleDbDataAdapter.cs
- QfeChecker.cs
- InheritanceRules.cs
- XmlAttributeCollection.cs
- BuildProvidersCompiler.cs
- ByteAnimation.cs
- SqlSupersetValidator.cs
- _CookieModule.cs
- ToolStripPanelCell.cs
- IgnorePropertiesAttribute.cs
- _NtlmClient.cs
- DataControlImageButton.cs
- WebPartConnectionsDisconnectVerb.cs
- ListViewDataItem.cs
- ELinqQueryState.cs
- TagNameToTypeMapper.cs
- SoapAttributeOverrides.cs
- MultipleCopiesCollection.cs
- XamlLoadErrorInfo.cs
- FrameworkElementFactoryMarkupObject.cs
- JoinSymbol.cs
- DropShadowBitmapEffect.cs
- Vector3D.cs
- IDQuery.cs
- AuthenticatingEventArgs.cs
- GPStream.cs
- PersonalizationStateInfo.cs
- ObjectDataSourceSelectingEventArgs.cs
- ClientSponsor.cs
- FixedTextBuilder.cs
- reliableinputsessionchannel.cs
- TaskFileService.cs
- ExtensionQuery.cs
- FilterableAttribute.cs
- RotateTransform3D.cs
- ApplicationFileParser.cs
- PartManifestEntry.cs
- FullTrustAssembly.cs
- CompModSwitches.cs
- TopClause.cs
- NativeActivityFaultContext.cs
- HtmlControl.cs
- UIElementParaClient.cs
- SchemaTableOptionalColumn.cs
- DefaultAutoFieldGenerator.cs
- BufferedWebEventProvider.cs
- SafeNativeMethods.cs
- BamlTreeUpdater.cs
- WebPartVerbCollection.cs
- XmlSchemaComplexType.cs
- SmtpClient.cs
- MLangCodePageEncoding.cs
- OleDbRowUpdatedEvent.cs
- SlipBehavior.cs
- path.cs
- IERequestCache.cs
- InvokeMethodActivity.cs
- TraceHandlerErrorFormatter.cs
- RelativeSource.cs
- CommonDialog.cs
- TranslateTransform3D.cs
- LookupNode.cs
- HitTestWithGeometryDrawingContextWalker.cs
- WebBrowserNavigatingEventHandler.cs
- SqlDataSourceView.cs
- CSharpCodeProvider.cs
- XPathSingletonIterator.cs
- AutoSizeToolBoxItem.cs
- XsltContext.cs
- ListBindingHelper.cs
- SqlServices.cs
- IndicShape.cs
- ContextMenuStripGroup.cs
- DbProviderFactories.cs
- SqlNamer.cs
- COM2Properties.cs
- SqlServices.cs