Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / Extensions / Profile / ProfileService.cs / 1305376 / ProfileService.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Web.Profile {
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Configuration;
using System.Diagnostics;
using System.Web.ApplicationServices;
using System.Web.Script.Serialization;
using System.Web.Script.Services;
using System.Web.Services;
[ScriptService]
internal sealed class ProfileService {
private static JavaScriptSerializer _javaScriptSerializer;
private static JavaScriptSerializer JavaScriptSerializer {
get {
if (_javaScriptSerializer == null) {
HttpContext context = HttpContext.Current;
WebServiceData webServiceData = WebServiceData.GetWebServiceData(context, context.Request.FilePath);
_javaScriptSerializer = webServiceData.Serializer;
Debug.Assert(_javaScriptSerializer != null);
}
return _javaScriptSerializer;
}
}
private static Dictionary GetProfile(HttpContext context, IEnumerable properties) {
ProfileBase profile = context.Profile;
if(profile == null) {
return null;
}
Dictionary allowedGet = ApplicationServiceHelper.ProfileAllowedGet;
if (allowedGet == null || allowedGet.Count == 0) {
// there are no readable properties
return new Dictionary(0);
}
Dictionary dictionary = null;
if(properties == null) {
// initialize capacity to the exact number we will fill: the number of readAccessProperties
dictionary = new Dictionary(allowedGet.Count, StringComparer.OrdinalIgnoreCase);
// Returns all profile properties defined in configuration when given properties array is null
string propertyName;
foreach(KeyValuePair entry in allowedGet) {
// note: dont enumerate over _allowedGet.Keys since it unecessarily creates a keys collection object
propertyName = entry.Key;
dictionary.Add(propertyName, profile[propertyName]);
}
}
else {
// initialize capacity to the largest possible number of properties we may return.
dictionary = new Dictionary(allowedGet.Count, StringComparer.OrdinalIgnoreCase);
// Returns the specified profile properties (if empty array, no properties returned)
foreach(string propertyName in properties) {
if(allowedGet.ContainsKey(propertyName)) {
dictionary.Add(propertyName, profile[propertyName]);
}
}
}
return dictionary;
}
private static Collection SetProfile(HttpContext context, IDictionary values) {
// return collection of successfully saved settings.
Collection failedSettings = new Collection();
if (values == null || values.Count == 0) {
// no values were given, so we're done, and there are no failures.
return failedSettings;
}
ProfileBase profile = context.Profile;
Dictionary allowedSet = ApplicationServiceHelper.ProfileAllowedSet;
// Note that profile may be null, and allowedSet may be null.
// Even though no properties will be saved in these cases, we still iterate over the given values to be set,
// because we must build up the failed collection anyway.
bool profileDirty = false;
foreach(KeyValuePair entry in values) {
string propertyName = entry.Key;
if (profile != null && allowedSet != null && allowedSet.ContainsKey(propertyName)) {
SettingsProperty settingProperty = ProfileBase.Properties[propertyName];
if (settingProperty != null && !settingProperty.IsReadOnly &&
(!profile.IsAnonymous || (bool)settingProperty.Attributes["AllowAnonymous"])) {
Type propertyType = settingProperty.PropertyType;
object convertedValue;
if (ObjectConverter.TryConvertObjectToType(entry.Value, propertyType, JavaScriptSerializer, out convertedValue)) {
profile[propertyName] = convertedValue;
profileDirty = true;
// setting successfully saved.
// short circuit the foreach so only failed cases fall through.
continue;
}
}
}
// Failed cases fall through to here. Possible failure reasons:
// 1. type couldn't be converted for some reason (TryConvert returns false)
// 2. the property doesnt exist (settingProperty == null)
// 3. the property is read only (settingProperty.IsReadOnly)
// 4. the current user is anonymous and the setting doesn't allow anonymous access
// 5. profile for this user is null (profile == null)
// 6. no properties are allowed for setting (allowedSet is null)
// 7. *this* property is not allowed for setting (allowedSet.Contains returns false)
failedSettings.Add(propertyName);
}
if (profileDirty) {
profile.Save();
}
return failedSettings;
}
[WebMethod]
public Dictionary GetAllPropertiesForCurrentUser(bool authenticatedUserOnly) {
ApplicationServiceHelper.EnsureProfileServiceEnabled();
HttpContext context = HttpContext.Current;
if (authenticatedUserOnly) {
ApplicationServiceHelper.EnsureAuthenticated(context);
}
return ProfileService.GetProfile(context, null);
}
[WebMethod]
public Dictionary GetPropertiesForCurrentUser(IEnumerable properties, bool authenticatedUserOnly) {
ApplicationServiceHelper.EnsureProfileServiceEnabled();
HttpContext context = HttpContext.Current;
if (authenticatedUserOnly) {
ApplicationServiceHelper.EnsureAuthenticated(context);
}
return ProfileService.GetProfile(context, properties);
}
[WebMethod]
public Collection GetPropertiesMetadata() {
ApplicationServiceHelper.EnsureProfileServiceEnabled();
return ApplicationServiceHelper.GetProfilePropertiesMetadata();
}
[WebMethod]
public Collection SetPropertiesForCurrentUser(IDictionary values, bool authenticatedUserOnly) {
ApplicationServiceHelper.EnsureProfileServiceEnabled();
HttpContext context = HttpContext.Current;
if (authenticatedUserOnly) {
ApplicationServiceHelper.EnsureAuthenticated(context);
}
return ProfileService.SetProfile(context, values);
}
}
}
// 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
- Image.cs
- PenThreadPool.cs
- DataControlField.cs
- OleDbStruct.cs
- ConstructorArgumentAttribute.cs
- CompilerScope.cs
- XmlRawWriter.cs
- ImageAttributes.cs
- StrokeSerializer.cs
- DesigntimeLicenseContextSerializer.cs
- DynamicEndpointElement.cs
- DeviceContext2.cs
- FontUnit.cs
- TransactionContextManager.cs
- MenuEventArgs.cs
- MLangCodePageEncoding.cs
- WindowsListView.cs
- listitem.cs
- PolicyManager.cs
- OracleCommand.cs
- ToolBarButton.cs
- WebCategoryAttribute.cs
- LinkedResource.cs
- Brush.cs
- TokenBasedSet.cs
- MembershipValidatePasswordEventArgs.cs
- Signature.cs
- XmlChoiceIdentifierAttribute.cs
- ResourcesChangeInfo.cs
- Resources.Designer.cs
- ErasingStroke.cs
- LassoSelectionBehavior.cs
- ViewBox.cs
- KeyGestureConverter.cs
- TreeNode.cs
- DataReaderContainer.cs
- GPStream.cs
- CannotUnloadAppDomainException.cs
- SqlRowUpdatedEvent.cs
- ResourceLoader.cs
- XmlAttributeAttribute.cs
- DataGridViewCell.cs
- BufferedGraphics.cs
- XmlSchemaObjectCollection.cs
- HttpVersion.cs
- PublishLicense.cs
- FormatterServicesNoSerializableCheck.cs
- TextWriter.cs
- NavigationHelper.cs
- WeakHashtable.cs
- CodeSpit.cs
- DataRowCollection.cs
- ConfigXmlAttribute.cs
- FlowDocumentPage.cs
- RubberbandSelector.cs
- BamlRecords.cs
- TriggerBase.cs
- ActiveXHelper.cs
- DocobjHost.cs
- TypeUtils.cs
- XmlSerializationWriter.cs
- SmiMetaData.cs
- DbConnectionOptions.cs
- List.cs
- _Rfc2616CacheValidators.cs
- VariantWrapper.cs
- SortQuery.cs
- MemberInfoSerializationHolder.cs
- BoundsDrawingContextWalker.cs
- Point3D.cs
- PromptEventArgs.cs
- WebPartDisplayModeCancelEventArgs.cs
- DateTime.cs
- TextRangeBase.cs
- EntityDataSourceWrapperPropertyDescriptor.cs
- QueryOutputWriterV1.cs
- CacheMemory.cs
- TraceContextEventArgs.cs
- QilInvokeEarlyBound.cs
- oledbmetadatacolumnnames.cs
- CriticalHandle.cs
- SimpleBitVector32.cs
- SevenBitStream.cs
- WCFModelStrings.Designer.cs
- ArcSegment.cs
- FontFamily.cs
- MobileUserControlDesigner.cs
- TitleStyle.cs
- basevalidator.cs
- Queue.cs
- EditableRegion.cs
- EmbeddedMailObject.cs
- MessageSmuggler.cs
- formatter.cs
- XmlParserContext.cs
- ADMembershipProvider.cs
- XPathEmptyIterator.cs
- FacetValueContainer.cs
- StickyNoteHelper.cs
- HttpRawResponse.cs