Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Channels / BufferedMessageWriter.cs / 1 / BufferedMessageWriter.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Channels { using System.IO; using System.Xml; using System.Diagnostics; abstract class BufferedMessageWriter { int[] sizeHistory; int sizeHistoryIndex; const int sizeHistoryCount = 4; const int expectedSizeVariance = 256; BufferedOutputStream stream; public BufferedMessageWriter() { stream = new BufferedOutputStream(SR.MaxSentMessageSizeExceeded); InitMessagePredicter(); } protected abstract XmlDictionaryWriter TakeXmlWriter(Stream stream); protected abstract void ReturnXmlWriter(XmlDictionaryWriter writer); public ArraySegmentWriteMessage(Message message, BufferManager bufferManager, int initialOffset, int maxSizeQuota) { int effectiveMaxSize; // make sure that maxSize has room for initialOffset without overflowing, since // the effective buffer size is message size + initialOffset if (maxSizeQuota <= int.MaxValue - initialOffset) effectiveMaxSize = maxSizeQuota + initialOffset; else effectiveMaxSize = int.MaxValue; int predictedMessageSize = PredictMessageSize(); if (predictedMessageSize > effectiveMaxSize) predictedMessageSize = effectiveMaxSize; else if (predictedMessageSize < initialOffset) predictedMessageSize = initialOffset; try { stream.Init(predictedMessageSize, maxSizeQuota, effectiveMaxSize, bufferManager); stream.Skip(initialOffset); XmlDictionaryWriter writer = TakeXmlWriter(stream); OnWriteStartMessage(writer); message.WriteMessage(writer); OnWriteEndMessage(writer); writer.Flush(); ReturnXmlWriter(writer); int size; byte[] buffer = stream.ToArray(out size); RecordActualMessageSize(size); return new ArraySegment (buffer, initialOffset, size - initialOffset); } finally { stream.Clear(); } } protected virtual void OnWriteStartMessage(XmlDictionaryWriter writer) { } protected virtual void OnWriteEndMessage(XmlDictionaryWriter writer) { } void InitMessagePredicter() { sizeHistory = new int[4]; for (int i = 0; i < sizeHistoryCount; i++) sizeHistory[i] = 256; } int PredictMessageSize() { int max = 0; for (int i = 0; i < sizeHistoryCount; i++) if (sizeHistory[i] > max) max = sizeHistory[i]; return max + expectedSizeVariance; } void RecordActualMessageSize(int size) { sizeHistory[sizeHistoryIndex] = size; sizeHistoryIndex = (sizeHistoryIndex + 1) % sizeHistoryCount; } } } // 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
- KeyManager.cs
- FileFormatException.cs
- Baml2006ReaderSettings.cs
- RawStylusInput.cs
- MSG.cs
- DesignerSerializationOptionsAttribute.cs
- X509WindowsSecurityToken.cs
- DescendantQuery.cs
- XXXOnTypeBuilderInstantiation.cs
- CultureInfoConverter.cs
- HtmlControlPersistable.cs
- PerformanceCountersElement.cs
- WorkflowInstanceTerminatedRecord.cs
- Queue.cs
- TypeResolvingOptionsAttribute.cs
- SuppressMergeCheckAttribute.cs
- TransformCryptoHandle.cs
- DispatcherObject.cs
- SrgsGrammarCompiler.cs
- Animatable.cs
- FileUtil.cs
- DrawingCollection.cs
- PartialCachingControl.cs
- UInt64Converter.cs
- RegistrationServices.cs
- TdsParserStateObject.cs
- MinMaxParagraphWidth.cs
- wgx_exports.cs
- IndexedEnumerable.cs
- ValidationContext.cs
- ThemeDictionaryExtension.cs
- TreeViewItemAutomationPeer.cs
- ControlDesigner.cs
- SqlServer2KCompatibilityCheck.cs
- CorrelationManager.cs
- HashAlgorithm.cs
- SegmentTree.cs
- QueueException.cs
- MailMessageEventArgs.cs
- ImageBrush.cs
- AllMembershipCondition.cs
- NativeMethods.cs
- RegularExpressionValidator.cs
- DeviceFiltersSection.cs
- PropertyCondition.cs
- DetailsViewDeletedEventArgs.cs
- BStrWrapper.cs
- HtmlElementCollection.cs
- EntityDataSourceColumn.cs
- DataGridViewCellValidatingEventArgs.cs
- DataGridViewColumnDividerDoubleClickEventArgs.cs
- WebMessageEncodingBindingElement.cs
- MobileSysDescriptionAttribute.cs
- Models.cs
- EdmProviderManifest.cs
- MemberRelationshipService.cs
- SchemaNames.cs
- cookiecontainer.cs
- UnsafeNativeMethodsCLR.cs
- TemplateNameScope.cs
- PageCodeDomTreeGenerator.cs
- ExceptionUtil.cs
- SemanticBasicElement.cs
- JoinSymbol.cs
- FlowLayout.cs
- AsyncOperationManager.cs
- SamlAudienceRestrictionCondition.cs
- ConfigPathUtility.cs
- ReferenceEqualityComparer.cs
- PeerEndPoint.cs
- Typography.cs
- Win32MouseDevice.cs
- OdbcConnectionOpen.cs
- LeftCellWrapper.cs
- SqlSupersetValidator.cs
- SiteMapNodeItem.cs
- TimeZone.cs
- InvokeWebService.cs
- ExpressionPrinter.cs
- ColorConverter.cs
- CorrelationKey.cs
- AnnotationStore.cs
- RestClientProxyHandler.cs
- WorkItem.cs
- CompilationRelaxations.cs
- NumericUpDownAccelerationCollection.cs
- IsolatedStorage.cs
- TextWriter.cs
- StylusEventArgs.cs
- DataObjectMethodAttribute.cs
- UnionQueryOperator.cs
- InitializationEventAttribute.cs
- DataGridToolTip.cs
- ComponentResourceKeyConverter.cs
- LineBreak.cs
- UIElement.cs
- ComponentChangedEvent.cs
- ResolvedKeyFrameEntry.cs
- SoapSchemaMember.cs
- SourceFileBuildProvider.cs