Singleton in .NET 4.0 – вопрос снят?
Про собеседования, джавистов и дотнетчиков, многопоточный синглтон, про то, зачем нам ленивая инициализация, и как теперь хорошо в .NET 4.0. Читать дальше
Про собеседования, джавистов и дотнетчиков, многопоточный синглтон, про то, зачем нам ленивая инициализация, и как теперь хорошо в .NET 4.0. Читать дальше
На фоне работы над следующими постами о работе с InfoPath формами (работа с источниками данных, udcx файлы, отправка формы, валидация, вьюшки, локализация, а так же написание кода форм) , первый из которых посвящен развертыванию (InfoPath dev #1: развертывание InfoPath 2010 форм в составе wsp-решения), происходит много интересных вещей. Пошел уже второй месяц плотной работы с InfoPath 2010 и, как следствие, разминировано много километров минных полей врага проработан ряд подходов для решения тех или иных задач.
Ниже расскажу об одном из найденных затыков, в точнее о том, как при помощи всего лишь двух контролов можно положить форму InfoPath 2010 и как решать те проблемы, которые совсем не гуглятся.
Итак, к делу!
Проблема
Соберем очень простую форму из одной repeat table и одного calculated value:
Не будем ее разветывать в виде feature, а указав в Form Options->Security and Trust->Domain, опубликуем в Network Location.
Далее, перейдем в Центр администрирования->InfoPath Forms Services->Управление шаблонами форм->Отправить шаблон формы и попробуем проверить наш шаблон формы. Все должно быть ок. При развертывании формы посредством feature, мы получаем тот же эффект – т.е. если форма не проходит валидацию в центре администрирования, то она не развернется посредством feature. Теперь попробуем отфильтровать значения repeat table следующим образом -
Repeating Table Properties->Display->Filter Data->Add, далее настройте любой фильтр (я сделал сравнение первого поля таблицы с «1″):
Сохраняем форму, публикуем, пробуем поверить ее в центре администрирования.
Результат совсем не радует, хотя действие, весьма безобидное:
Логи в hive 14 говорят, что где то в недрах инфраструктуры SharePoint/FormServices что то совсем негладко:
09/01/2010 13:24:21.39 w3wp.exe (0x14B4) 0x0D44 InfoPath Forms Services Conversion and Deployment 82lx Exception ConstructFromXsnFile failed with unhandled exception System.NullReferenceException: Object reference not set to an instance of an object. at Microsoft.Office.InfoPath.Server.SolutionLifetime.Filters.c__DisplayClass2.b__0(BaseControl match) at System.Collections.Generic.List`1.Find(Predicate`1 match) at Microsoft.Office.InfoPath.Server.SolutionLifetime.Filters.CreateDependentNodeList(BaseControl control, String expressionString) at Microsoft.Office.InfoPath.Server.SolutionLifetime.Filters.AnnotateView(Solution solution, View view) at Microsoft.Office.InfoPath.Server.Converter.SolutionConverter.ConvertView(Solution solution, ConverterDocument converterDocument) at Microsoft.Office.InfoPath.Server.Converter.SolutionConverter.ConvertSolution(S… 5e6bfd91-333f-46f0-b7c7-1e5d89d2ecc7
09/01/2010 13:24:21.39* w3wp.exe (0x14B4) 0x0D44 InfoPath Forms Services Conversion and Deployment 82lx Exception …olution solution) at Microsoft.Office.InfoPath.Server.SolutionLifetime.Solution.c__DisplayClass2.b__0() at Microsoft.Office.Server.Diagnostics.FirstChanceHandler.ExceptionFilter(Boolean fRethrowException, TryBlock tryBlock, FilterBlock filter, CatchBlock catchBlock, FinallyBlock finallyBlock) 5e6bfd91-333f-46f0-b7c7-1e5d89d2ecc7
09/01/2010 13:24:21.39 w3wp.exe (0x14B4) 0x0D44 SharePoint Server Unified Logging Service c91s Monitorable Watson bucket parameters: SharePoint Server 2010, ULSException14, 41b7c39f «infopath forms services», 0e00129b «14.0.4763.0″, fd34ba92 «microsoft.office.infopath.server», 0e00128e «14.0.4750.0″, 4b8a352e «sun feb 28 01:19:42 2010″, 00003706 «00003706″, MISSING, 4a6d3421 «nullreferenceexception», 38326c78 «82lx» 5e6bfd91-333f-46f0-b7c7-1e5d89d2ecc7
09/01/2010 13:24:21.39 w3wp.exe (0x14B4) 0x0D44 InfoPath Forms Services Conversion and Deployment 8jc7 Medium Deployment failed conversion, or design checker found fatal errors: Непредвиденная ошибка при проверке шаблона формы. 5e6bfd91-333f-46f0-b7c7-1e5d89d2ecc7
09/01/2010 13:24:21.41 w3wp.exe (0x14B4) 0x0D44 InfoPath Forms Services Runtime 82mk Exception LoadDocumentAndPlayEventLog failed with unhandled exception System.NullReferenceException: Object reference not set to an instance of an object. at Microsoft.Office.InfoPath.Server.SolutionLifetime.Filters.c__DisplayClass2.b__0(BaseControl match) at System.Collections.Generic.List`1.Find(Predicate`1 match) at Microsoft.Office.InfoPath.Server.SolutionLifetime.Filters.CreateDependentNodeList(BaseControl control, String expressionString) at Microsoft.Office.InfoPath.Server.SolutionLifetime.Filters.AnnotateView(Solution solution, View view) at Microsoft.Office.InfoPath.Server.Converter.SolutionConverter.ConvertView(Solution solution, ConverterDocument converterDocument) at Microsoft.Office.InfoPath.Server.Converter.SolutionConverter.ConvertSol… 5e6bfd91-333f-46f0-b7c7-1e5d89d2ecc7
09/01/2010 13:24:21.41* w3wp.exe (0x14B4) 0x0D44 InfoPath Forms Services Runtime 82mk Exception …ution(Solution solution) at Microsoft.Office.InfoPath.Server.SolutionLifetime.Solution.c__DisplayClass2.b__0() at Microsoft.Office.Server.Diagnostics.FirstChanceHandler.ExceptionFilter(Boolean fRethrowException, TryBlock tryBlock, FilterBlock filter, CatchBlock catchBlock, FinallyBlock finallyBlock) at Microsoft.Office.Server.Diagnostics.ULS.SendWatsonOnExceptionTag(UInt32 tagID, ULSCatBase categoryID, String output, Boolean fRethrowException, TryBlock tryBlock, CatchBlock catchBlock, FinallyBlock finallyBlock) at Microsoft.Office.InfoPath.Server.SolutionLifetime.Solution.ConstructFromXsnFile(ConversionContext context, SolutionCabinet solutionCabinet, SolutionIdentity solutionId) at Microsoft.Office.InfoPath.Server.Converter.ConversionAppDomain.O… 5e6bfd91-333f-46f0-b7c7-1e5d89d2ecc7
09/01/2010 13:24:21.41* w3wp.exe (0x14B4) 0x0D44 InfoPath Forms Services Runtime 82mk Exception …perationRunner.ExecuteConversion(ConversionContext& context, SolutionCabinet solutionCabinet, SolutionIdentity solutionId, Boolean executeVerification) at Microsoft.Office.InfoPath.Server.Converter.ConversionAppDomain.ExecuteInRemote(ConversionContext context, AppDomain domain, SolutionCabinet solutionCabinet, SolutionIdentity solutionId) at Microsoft.Office.InfoPath.Server.Converter.ConversionAppDomain.TryRunConversion(ConversionContext context, SolutionCabinet solutionCabinet, SolutionIdentity solutionId, Byte[] solutionData, WspSolutionInfo wspSolution) at Microsoft.Office.InfoPath.Server.Converter.ConversionAppDomain.RunConversion(ConversionContext context, SolutionCabinet solutionCabinet, SolutionIdentity solutionId) at Microsoft.Office.InfoPath.Server.Util.InstalledSo… 5e6bfd91-333f-46f0-b7c7-1e5d89d2ecc7
09/01/2010 13:24:21.41* w3wp.exe (0x14B4) 0x0D44 InfoPath Forms Services Runtime 82mk Exception …lutions.c__DisplayClass7.b__6() at Microsoft.Office.Server.Diagnostics.FirstChanceHandler.ExceptionFilter(Boolean fRethrowException, TryBlock tryBlock, FilterBlock filter, CatchBlock catchBlock, FinallyBlock finallyBlock) 5e6bfd91-333f-46f0-b7c7-1e5d89d2ecc7 Трейс совершенно бесполезный, ничего не гуглится и ни о чем не говорит. Что ж, продолжим. Попробуем поменять местами repeat table и calculated value. Так, что бы repeat table был перед calculated value:
Снова публикуем форму, проверяем ее в центре администрирования и… все ок! Данная форма стабильно падает при валидации в центре администрирования как на рабочей машине, так и в виртуалках дома. Дистрибутив SharePoint Server скачан с официального сайта MS, стоит на win2008r2 – все ставилось с нуля и никаких особых настроек не делал. Если у кого время будет – соберите такую форму, интересно как это будет работать у вас. Решение
Ловить такие глюки, когда ваша форма имеет 16+ подключений к данным, несколько вьюшек, в ней реализован механиз локализации, накручено куча правил и валидации, а так же имеется кастомный код и кастомная отправка в библиотеку документов – врагу не пожелаешь. На текущий момент я не нашел никакого workaroud’а, за исключением очевидного – не использовать фильтры в repeat table при наличии на форме calculated values. Не стоит отчаиваться в таких ситуациях, так как всегда можно найти решение.
Локализовать такого рода проблемы и разобраться в чем дело можно последовательным удалением сначала вьюшек, а потом отдельных элементов управления вместе с правилами. Т.е. удаляем кучку элементов, пробуем публиковать. Глючит, ага, удаляем еще пачку элементов, снова публикуем – и так, пока проблема не будет локализована. Счастливой разработки под InfoPath – да пребудем с вами сила, коллеги
Часто изменение свойств объекта ведет к необходимости вызова метода для обработки новых данных. Например, в разрабатываемом классе, после добавления новых данных необходимо вызывать метод сортировки. При добавлении серии получится множество ненужных вызовов. В этой ситуации логично отложить сортировку до окончания изменений. Как лучше это сделать? Рассмотрим один из вариантов решения данной проблемы. Читать далее …
Скрипт для восстановления базы данных SQL Server 2008 из резервной копии. Проверяет существует ли БД и создает новую, если таковой нет. Перед восстановлением разрывает все активные подключения к БД. Поддерживает Windows аутентификацию. Написал этот скрипт, потому что надоело при каждом восстановлении базы данных делать detach/attach, что бы "убить" все процессы, которые ее занимают. Почему-то в Sql Server Management Studio не предусмотрена галочка "Drop Connections". Скрипт писался для себя и не претендует на универсальность. Скрипт использует следующие возможности PowerShell: Обработка ошибок;
Получение параметров из командной строки;
Загрузка .NET сборок;
Собственно, работа с Sql Server.
cls
# Обработка ошибок
trap [Exception] {
write-host " FAILURE" -ForegroundColor Red
write-host "Exception: " -ForegroundColor Red -NoNewline
write-host $_.Exception.GetType().FullName
write-host "Message: " -ForegroundColor Red -NoNewline
write-host $_.Exception.Message
if($debug -eq $true) {
write-host "Stack Trace: " -ForegroundColor Cyan -NoNewline
write-host $_.Exception.StackTrace -ForegroundColor Cyan
}
if($_.Exception.InnerException -ne $null) {
write-host "`tInner Exception: " -ForegroundColor Red -NoNewline
write-host $_.Exception.InnerException.GetType().FullName
write-host "`tInner Message: " -ForegroundColor Red -NoNewline
write-host $_.Exception.InnerException.Message
if($debug -eq $true) {
write-host "`tStack Trace: " -ForegroundColor Cyan -NoNewline
write-host $_.Exception.InnerException.StackTrace -ForegroundColor Cyan
}
if($_.Exception.InnerException.InnerException -ne $null) {
write-host "`t`tInner Inner Exception: " -ForegroundColor Red -NoNewline
write-host $_.Exception.InnerException.InnerException.GetType().FullName
write-host "`t`tInner Inner Message: " -ForegroundColor Red -NoNewline
write-host $_.Exception.InnerException.InnerException.Message
if($debug -eq $true) {
write-host "`tStack Trace: " -ForegroundColor Cyan -NoNewline
write-host $_.Exception.InnerException.StackTrace -ForegroundColor Cyan
}
}
}
return
}
write-host "==============================================================================="
write-host "===== SQL Server database restore script ====="
write-host "==============================================================================="
write-host
# Параметры коммандной строки
$srv = ""
$db = ""
$uid = ""
$pwd = ""
$backup = ""
$debug = $false
# Разбор параметров командной строки
for ($index = 0; $index -lt $args.Length; $index += 2) {
$name = $args[$index]
$value = $args[$index + 1]
switch ($name) {
"-srv" { $srv = $value }
"-db" { $db = $value }
"-uid" { $uid = $value }
"-pwd" { $pwd = $value }
"-backup" { $backup = $value }
"-debug" {
$debug = $true
$index = $index – 1
}
"-help" {
"—– General Info ————————————————————"
"`n Script restores SQL Server 2008 database from spcified backup file."
"`n Leave uid and pwd parameters empty to use Windows Authentication mode."
"`n—– Parameters Info ———————————————————"
"`n`t-srv : Server name. Example: localhost\SQLExpress, (local)"
"`n`t-db : Database name"
"`n`t-uid : User ID"
"`n`t-pwd : Password. Should be wrapped by quotes if contains special symbols"
"`n`t-backup : Backup file full path to restore. Or relative to SQL Server"
"`n`t default backup directory"
"`n`t-help : Show this help"
"`n—– Using ——————————————————————-"
"`n`tScriptName.ps1 -srv {Sql Server Instance name}"
"`t -db {DatabaseName}"
"`t [-uid {User ID} -pwd {`"Password`"}]"
"`t -backup {FULL PATH}"
"`n——————————————————————————-`n"
return
}
}
}
write-host "—– 1. Parse parameters —————————————————–`n"
# Валидация параметров
$allParams = $true
$winAuth = $false
if ($srv -eq "") {
Write-Host "Server [-srv] doesn’t specified" -Foreground Red
$allParams = $false
}
if ($db -eq "") {
Write-Host "Database [-db] doesn’t specified" -Foreground Red
$allParams = $false
}
if ($uid -eq "" -and $pwd -eq "") {
Write-Host "WINDOWS AUTHENTICATION MODE ENABLED" -Foreground Green
$winAuth = $true
}
else {
if ($uid -eq "") {
Write-Host "User ID [-uid] doesn’t specified" -Foreground Red
$allParams = $false
}
if ($pwd -eq "") {
Write-Host "Password [-pwd] doesn’t specified" -Foreground Red
$allParams = $false
}
Write-Host "User ID [-uid] doesn’t specified" -Foreground Red
Write-Host "Password [-pwd] doesn’t specified" -Foreground Red
}
if ($backup -eq "") {
Write-Host "Backup file path [-backup] doesn’t specified" -Foreground Red
}
if($allParams -ne $true) {
Write-Host "Specify missing parameters and try again. Use -help to get help`n" -Foreground Red
return
}
else {
Write-Host "SUCCESS" -Foreground Green
}
write-host "`n—– 2. Restore database —————————————————–`n"
# Загрузка сборок
Write-Host "Load assemblies…" -NoNewline
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null
Write-Host " OK" -ForegroundColor Green
# Установка параметров сервера
Write-Host "Setup server object…" -NoNewline
$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $srv
if($winAuth -eq $false) {
$server.ConnectionContext.LoginSecure = $false
$server.ConnectionContext.Login = $uid
$server.ConnectionContext.Password = $pwd
}
Write-Host " OK" -ForegroundColor Green
# Закрытие открытых подключений
Write-Host "Drop opened connections…" -NoNewline
$server.KillAllProcesses($db);
Write-Host " OK" -ForegroundColor Green
# Установка параметров восстановления
Write-Host "Setup restore object…" -NoNewline
$databaseRestore = new-object("Microsoft.SqlServer.Management.Smo.Restore")
$databaseRestore.NoRecovery = $false
$databaseRestore.ReplaceDatabase = $true
$databaseRestore.Action = "Database"
$databaseRestore.Database = $db
# Установка пути к файлу резервной копии
$backupDevice = New-Object ("Microsoft.SqlServer.Management.Smo.BackupDeviceItem") ($backup, "File")
$databaseRestore.Devices.Add($backupDevice)
# Если БД с таким именем нет, то она создается
if($server.Databases.Contains($db) -eq $false)
{
$restoreDetails = $databaseRestore.ReadBackupHeader($server)
$newRestoreDataFile = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
$newRestoreDataFile.LogicalFileName = $restoreDetails.Rows[0]["DatabaseName"]
$newRestoreDataFile.PhysicalFileName = $server.Information.MasterDBPath + "\" + $databaseRestore.Database + "_Data.mdf"
$databaseRestore.RelocateFiles.Add($newRestoreDataFile) | Out-Null
$newRestoreLogFile = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
$newRestoreLogFile.LogicalFileName = $restoreDetails.Rows[0]["DatabaseName"] + "_Log"
$newRestoreLogFile.PhysicalFileName = $server.Information.MasterDBLogPath + "\" + $databaseRestore.Database + "_Log.ldf"
$databaseRestore.RelocateFiles.Add($newRestoreLogFile) | Out-Null
}
Write-Host " OK" -ForegroundColor Green
# Восстановление базы данных
Write-Host "Restore database…" -NoNewline
$databaseRestore.SqlRestore($server)
Write-Host " OK" -ForegroundColor Green
Write-Host "SUCCESS. Server :" $srv -ForegroundColor Green
Write-Host " Database :" $db -ForegroundColor Green
Write-Host " Backup file:" $backup -ForegroundColor Green
return $backup | Out-Null Скриншот прилагается. Скачать скрипт.
Recent Comments