Показаны сообщения с ярлыком Microsoft Magic. Показать все сообщения
Показаны сообщения с ярлыком Microsoft Magic. Показать все сообщения

четверг, 20 января 2011 г.

Пустая ошибка SharePoint Designer

Столкнулись с интересной проблемой: у клиентов SharePoint Designer 2010 отказался соединяться с нашим порталом (SharePoint Foundation 2010). А сообщение об ошибке оказалось... пустым!

Симптомы (при попытке открытия сайта из SharePoint Designer):




По таким сообщениям об ошибке совершенно ничего не ясно, тем более, что сам портал прекрасно открывается через браузер и никаких ошибок не выдает.

Но если немножко поискать, в Windows Event Viewer можно обнаружить более подробное описание данной ошибки. Впрочем, тоже не слишком вразумительное:

Службе WebHost не удалось обработать запрос
Сведения об отправителе: System.ServiceModel.ServiceHostingEnvironment+HostingManager/32521977
Исключение: System.ServiceModel.ServiceActivationException: Не удается активировать запрошенную службу "/_vti_bin/client.svc" из-за исключения во время компиляции. Сообщение об исключении: Операция является недопустимой из-за текущего состояния объекта.. ---> System.InvalidOperationException: Операция является недопустимой из-за текущего состояния объекта.
в Microsoft.SharePoint.ApplicationRuntime.SPLayoutsMappedFile.MapLayoutsVirtualPath(String virtualPath)
в Microsoft.SharePoint.ApplicationRuntime.SPVirtualPathProvider.GetCacheKey(String virtualPath)
в System.Web.Compilation.BuildManager.GetCacheKeyFromVirtualPath(VirtualPath virtualPath, Boolean& keyFromVPP)
в System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
в System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
в System.Web.Compilation.BuildManager.GetCompiledCustomString(String virtualPath)
в System.ServiceModel.ServiceHostingEnvironment.HostingManager.GetCompiledCustomString(String normalizedVirtualPath)
в System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService(String normalizedVirtualPath)
в System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(String normalizedVirtualPath)
в System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
--- Конец трассировки внутреннего стека исключений ---
в System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
в System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast(String relativeVirtualPath)
Имя процесса: w3wp

На системах с английской локалью сообщение выглядит следующим образом:


WebHost failed to process a request.
Sender Information: System.ServiceModel.ServiceHostingEnvironment+HostingManager/17653682
Exception: System.ServiceModel.ServiceActivationException: The service '/_vti_bin/client.svc' cannot be activated due to an exception during compilation. The exception message is: Operation is not valid due to the current state of the object.. ---> System.InvalidOperationException: Operation is not valid due to the current state of the object.
at Microsoft.SharePoint.ApplicationRuntime.SPLayoutsMappedFile.MapLayoutsVirtualPath(String virtualPath)
at Microsoft.SharePoint.ApplicationRuntime.SPVirtualPathProvider.GetCacheKey(String virtualPath)
at Microsoft.SharePoint.Publishing.Internal.CmsVirtualPathProvider.GetCacheKey(String virtualPath)
at System.Web.Compilation.BuildManager.GetCacheKeyFromVirtualPath(VirtualPath virtualPath, Boolean& keyFromVPP)
at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
at System.Web.Compilation.BuildManager.GetCompiledCustomString(String virtualPath)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.GetCompiledCustomString(String normalizedVirtualPath)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService(String normalizedVirtualPath)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(String normalizedVirtualPath)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
--- End of inner exception stack trace ---
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
at System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast(String relativeVirtualPath)
Process Name: w3wp


Ниже описано решение данной проблемы.

вторник, 19 октября 2010 г.

Microsoft Magic: Локализация стандартного списка Links

Видимо, серия Microsoft Magic скоро станет самой большой серией постов в этом блоге :)

Итак, задача очень распространенная. Есть в шарике стандартный список Links. Если мы хотим создать инстанс этого списка для собственных целей, это делается очень просто, создаем айтем ListInstance, и заполняем его примерно следующим XML-ем:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <ListInstance Id=""
                Title="$Resources:core,linksList"
                OnQuickLaunch="FALSE"
                TemplateType="103"
                FeatureId="00bfea71-2062-426c-90bf-714c59600103"
                Url="PersonalLinks"
                Description="">
    <Data>
      <Rows>
        <Row>
          <Field Name="ID">1</Field>
          <Field Name='URL'>http://google.ru, Поиск Google</Field>
        </Row>
        <Row>
          <Field Name="ID">2</Field>
          <Field Name='URL'>http://omlin.blogspot.com, Блог Омлина :)</Field>
        </Row>
      </Rows>
    </Data>
  </ListInstance>
</Elements>

Ну и дальше, всё это добавляется в фичу и успешно деплоится.
И вот, мне потребовалось контент этого списка локализовать. Ну например, чтобы у америкосов был google.com, а у китайцев - baidu.com. Создаем ресурсный файл, ну и выносим ссылки. Все вроде просто. Но вот тут всплыл вдруг такой эксепшен:
Недопустимый URL-адрес: $Resources: TestResources. >> в Microsoft.SharePoint.Administration.SPElementDefinitionCollection.ProvisionListInstances(SPFeaturePropertyCollection props, SPSite site, SPWeb web, Boolean fForce)

Нерабочий вариант:

<Row>
    <Field Name="ID">1</Field>
    <Field Name='URL'>$Resources: TestResources, Links_ItemUrl1</Field>
</Row>

Совершенно случайно, обнаружился рабочий вариант. Сравниваем:

<Row>
    <Field Name="ID">1</Field>
    <Field Name='URL'>$Resources:TestResources, Links_ItemUrl1</Field>
</Row>

No comments :)

P.S. Актуально для полей типа URL в любых списках.

среда, 29 сентября 2010 г.

Microsoft Magic: Setup-проекты

Вчера несколько часов убили, разбираясь с такого рода ошибками при добавлении новых файлов в установщик:
Error 39 Unable to find source file 'D:\Projects\<путь к файлу>\xxx.DLL' for assembly 'xxx.DLL', located in '[TARGETDIR]\<путь к файлу на целевой системе>'
Проблема крылась в появлении магическим образом дубликатов некой dll-ки, уже добавленной в проект ранее. Причем, у дубликатов был неверный SourcePath, из-за чего и ругалась студия.

Никаким нормальным путем, силами трех разработчиков, решить проблему не удалось. В итоге, стараясь не дышать, как-то всё же нам удалось, откатившись на последнюю рабочую версию, с третьей попытки добавить нужные файлы так, чтобы магических дубликатов не возникло...

Сегодня решил порыться в интернете на эту тему как следует, и через некоторое время обнаружил статью "Wrestling with Windows Installer", которая помогла решить проблему.

Оказывается, у Setup-проекта есть такое магическое свойство SearchPath. Вообще говоря, по умолчанию оно пустое:

 , но если нажать кнопку [...], оказывается, что по умолчанию там выставлена галочка Include standard search paths:



Если снимаешь эту галочку, то проблемы с дублирующимися dll-ками магическим образом исчезают. Вау :)