У меня есть несколько классов, производных от SPPersistedObject. Одним из них является мой класс верхнего уровня, который содержит коллекцию других производных объектов SPPersistedObject. Вот примерный план моего кода:
[System.Runtime.InteropServices.GuidAttribute("9BEDC353-F0AC-40FA-A28B-E18FB22EA9CA")
internal class FolderSettings : SPPersistedObject
{
[Persisted]
Guid _folderId;
[Persisted]
string _folderName;
public FolderSettings() : base() {}
protected FolderSettings(Guid folderId, string folderName) : base()
{
_folderId = folderId;
_folderName = folderName;
}
}
[System.Runtime.InteropServices.GuidAttribute("329DE509-76E6-4FA5-A9C1-2543F0A6B5D3")]
internal class EnhancedFolderSettings : FolderSettings
{
[Persisted]
string _outputLocation;
public EnhancedFolderSettings() : base() {}
public EnhancedFolderSettings(Guid folderId, string folderName,
string outputLocation) : base(folderId, folderName)
{
_outputLocation = outputLocation;
}
}
[System.Runtime.InteropServices.GuidAttribute("62FA87FB-2BB4-4AC6-A82A-737E8BEC0219")]
internal class EnhancedFolderSettingsCollection : SPPersistedObject,
IDictionary<Guid, EnhancedFolderSetrtings>
{
[Persisted]
Dictionary<Guid, EnhancedFolderSettings> _collection =
Dictionary<Guid, EnhancedFolderSettings>();
public EnhancedFolderSettingsCollection() : base() {}
// Implementation of IDictionary Interface here
// Implementation of ICollection Interface here
// Implementation of IEnumerable Interface here
}
[System.Runtime.InteropServices.GuidAttribute("F080ED50-85DF-4821-884B-97B05995F8F1")]
internal class FeatureSettings : SPPersistedObject
{
[Persisted]
string _workingFolder;
[Persisted]
string _serviceIpAddress;
public FeatureSettings() : base() {}
public FeatureSettings(string name, SPPersistedObject parent)
: base(name, parent)
{
}
protected override bool HasAdditionalUpdateAccess()
{
return true;
}
}
[System.Runtime.InteropServices.GuidAttribute("C54B006A-69D4-4315-A9FF-F7998A985935")]
internal class EnhancedFeatureSettings : FeatureSettings
{
const string _SETTINGS_NAME = "EnhancedSettingsName";
[Persisted]
Dictionary<Guid, EnhancedFolderSettingsCollection> _siteFeatureSettings;
public EnhancedFeatureSettings() : base() {}
public EnhancedFeatureSettings(SPPersistedObject parent)
: base(_SETTINGS_NAME, parent)
{
}
public static EnhancedFeatureSettings GetSettings(bool createNew)
{
EnhancedFeatureSettings settings =
SPFarm.Local.GetChild<EnhancedFeatureSettings>(_SETTINGS_NAME);
if (settings == null && createNew)
{
settings = new EnhancedFeatureSettings(SPFarm.Local);
}
return settings;
}
internal EnhancedFolderSettingsCollection GetSiteSettings(Guid siteId)
{
EnhancedFolderSettingsCollection collection = null;
_siteFeatureSettings.TryGetValue(siteId, out collection);
return collection;
}
internal Dictionar<Guid, EnhancedFolderSettingsCollection> FolderSettings
{
get
{
return _siteFeatureSettings;
}
}
}
Это все классы настроек, теперь приведен пример кода, который пытается обновить настройки и вызывает ошибку. Следует отметить, что это выполняется в административном контексте (из окна конфигурации CentralAdmin), поэтому я не думаю, что это связано с разрешениями:
public void UpdateSettings(Guid siteId, Guid folderId,
EnhancedFolderSettings currentSettings)
{
var settings = EnhancedFeatureSettings.GetSettings(true);
var siteSettings = settings.GetSiteSettings(siteId);
if (siteSettings == null)
{
siteSettings = new EnhancedFolderSettingsCollection();
}
siteSettings[folderId] = currentSettings;
settings.FolderSettings[siteId] = siteSettings;
settings.Update() // This is the line that is causing the exception
}
Любая помощь будет оценена. Исключение составляет:
System.ArgumentException: значение не является допустимым guid.
Трассировка стека указывает на линию settings.Update()
.