Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.ServiceModel.Discovery / System / ServiceModel / Channels / DuplicateMessageDetector.cs / 1305376 / DuplicateMessageDetector.cs
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------
namespace System.ServiceModel.Channels
{
using System;
using System.Runtime;
using System.Security.Cryptography;
using System.ServiceModel.Discovery;
sealed class DuplicateMessageDetector : IDisposable
{
HashAlgorithm hashAlgorithm;
[Fx.Tag.Cache(typeof(string), Fx.Tag.CacheAttrition.PartialPurgeOnEachAccess, SizeLimit = "maxListLength parameter to constructor")]
DuplicateDetector duplicateDetector;
[Fx.Tag.SynchronizationObject()]
object thisLock;
bool disposed;
public DuplicateMessageDetector(int maxListLength)
{
Fx.Assert(maxListLength > 0, "maxListLength must be > 0");
this.disposed = false;
this.hashAlgorithm = HashAlgorithm.Create();
this.thisLock = new object();
this.duplicateDetector = new DuplicateDetector(maxListLength);
}
public bool IsDuplicate(ArraySegment msgBytes, out string hashString)
{
Fx.Assert(msgBytes != null, "messageBytes can't be null");
Fx.Assert(msgBytes.Count > 0, "messageBytes.Count must be > 0");
byte[] hash;
bool notDuplicate = true;
lock (this.thisLock)
{
if (disposed)
{
throw FxTrace.Exception.AsError(new ObjectDisposedException(this.GetType().ToString()));
}
hash = this.hashAlgorithm.ComputeHash(msgBytes.Array, msgBytes.Offset, msgBytes.Count);
}
hashString = Convert.ToBase64String(hash);
Fx.Assert(string.IsNullOrEmpty(hashString) == false, "computed hashstring is null or empty");
lock (this.thisLock)
{
//the act of retreiving an existing item pushes it to the front of the MRU list, ensuring
//that the oldest hashes are trimmed first when we hit the max length.
notDuplicate = this.duplicateDetector.AddIfNotDuplicate(hashString);
}
return !notDuplicate;
}
public void RemoveEntry(string msgHash)
{
Fx.Assert(!string.IsNullOrEmpty(msgHash), "Message hash should never be null or empty");
lock (this.thisLock)
{
if (this.disposed)
{
throw FxTrace.Exception.AsError(new ObjectDisposedException(this.GetType().ToString()));
}
this.duplicateDetector.Remove(msgHash);
}
}
public void Dispose()
{
if (this.disposed)
{
return;
}
lock (this.thisLock)
{
if (!this.disposed)
{
this.disposed = true;
if (this.duplicateDetector != null)
{
this.duplicateDetector.Clear();
}
this.hashAlgorithm.Clear();
this.hashAlgorithm = null;
}
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SpinLock.cs
- RegistryExceptionHelper.cs
- ProcessManager.cs
- BinaryFormatter.cs
- RepeatBehaviorConverter.cs
- BaseDataBoundControlDesigner.cs
- GeneralTransform3DCollection.cs
- OleDbException.cs
- RNGCryptoServiceProvider.cs
- ListDictionary.cs
- IdentityNotMappedException.cs
- GridViewEditEventArgs.cs
- TemplatedControlDesigner.cs
- WrapPanel.cs
- TabControlCancelEvent.cs
- ListViewSelectEventArgs.cs
- AssociativeAggregationOperator.cs
- StructuredCompositeActivityDesigner.cs
- EntityDesignerDataSourceView.cs
- GregorianCalendarHelper.cs
- CanonicalXml.cs
- ArithmeticException.cs
- SafeProcessHandle.cs
- Animatable.cs
- MaskInputRejectedEventArgs.cs
- PersistChildrenAttribute.cs
- UnrecognizedAssertionsBindingElement.cs
- Baml2006SchemaContext.cs
- RegexCompilationInfo.cs
- XmlLanguage.cs
- NopReturnReader.cs
- BamlTreeMap.cs
- ColorConverter.cs
- ConnectionManagementElementCollection.cs
- PassportIdentity.cs
- WindowsStatic.cs
- JsonFaultDetail.cs
- XmlChildNodes.cs
- StreamUpgradeBindingElement.cs
- ElementHostPropertyMap.cs
- ClientProxyGenerator.cs
- NativeActivityTransactionContext.cs
- D3DImage.cs
- ExtensionDataObject.cs
- InstanceDataCollection.cs
- Point3DValueSerializer.cs
- ConfigXmlSignificantWhitespace.cs
- TypeConstant.cs
- WindowsListViewItemCheckBox.cs
- EndPoint.cs
- MultiByteCodec.cs
- ClientEventManager.cs
- TableColumnCollectionInternal.cs
- SapiRecoContext.cs
- TraceXPathNavigator.cs
- LostFocusEventManager.cs
- UserControl.cs
- SiteMapNodeCollection.cs
- _Win32.cs
- SafeBitVector32.cs
- InvalidPrinterException.cs
- FontFaceLayoutInfo.cs
- LinearKeyFrames.cs
- Point4D.cs
- RootNamespaceAttribute.cs
- EntityReference.cs
- SystemColors.cs
- Table.cs
- WebPartMovingEventArgs.cs
- DesignerListAdapter.cs
- BuildManager.cs
- ProxyWebPartManager.cs
- ModelItemDictionary.cs
- SaveFileDialog.cs
- LoaderAllocator.cs
- InnerItemCollectionView.cs
- ModelToObjectValueConverter.cs
- RelAssertionDirectKeyIdentifierClause.cs
- ToolStripItemTextRenderEventArgs.cs
- Filter.cs
- LinearGradientBrush.cs
- XPathQilFactory.cs
- JoinGraph.cs
- ClosureBinding.cs
- ParserStack.cs
- StateRuntime.cs
- COM2Enum.cs
- VSWCFServiceContractGenerator.cs
- Tuple.cs
- ArrayWithOffset.cs
- ServiceRoute.cs
- NextPreviousPagerField.cs
- ParameterToken.cs
- DynamicAttribute.cs
- SqlMultiplexer.cs
- SubMenuStyleCollection.cs
- TextEditor.cs
- Stacktrace.cs
- ListDictionary.cs
- JobPageOrder.cs