четверг, 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


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

Решение


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

Оказывается, ошибка происходит только в случае, когда определенная фича дважды активируется на сайте. Т.е., если развернуть наш wsp на сайт, и активировать все фичи - все работает отлично. Но если деактивировать и снова активировать определенную фичу (или даже откатить wsp целиком, а затем снова развернуть wsp и активировать эту фичу) - начинает возникать описанная выше ошибка; причем, она не пропадает, пока не пересоздашь веб-приложение.

Поскольку фича-виновница осуществляет модификации web.config через объектную модель SharePoint (SPWebConfigModification), стало очевидно, что причина запрятана где-то в web.config.

Оказалось, что при втором применении модификаций web.config, из этого файла, из секции <system.serviceModel>, пропадал элемент:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

После добавления этого элемента вручную, проблема исчезла.
Да здравствует Microsoft Magic!

P.S. Проблема возникает как минимум на SharePoint Foundation 2010, скорее всего также и на SPS2010. Установка декабрьских Cumulative Updates решить эту проблему не помогла.

9 комментариев:

  1. Да с этими SPWebConfigModification вечно проблемы. Херовый способ придумали в Майкрософт для работы с веб-конфигом. Я думаю, проще и надёжней работать с конфигом, как с обычным xml через XElement или чё-нить подобное.

    ОтветитьУдалить
  2. как выяснилось, эта строчка лечит все обращения к вебсервисам шарепоинта. Столкнулся с аналогичной ошибкой, при удалении элементов списка (System.ServiceModel.ServiceActivationException).

    ОтветитьУдалить
  3. А где именно находится этот файл web.config. Вводил в поиске их там больше 60. В SP я новичок, не судите строго

    ОтветитьУдалить
  4. Олег, web.config нужно править соответствующий твоему веб-приложению. Например, если у тебя SharePoint-портал развернут на 80-м порту, тебе нужен файл C:\inetpub\wwwroot\wss\VirtualDirectories\80\web.config

    ОтветитьУдалить
  5. Спасибо, попробовал) Но ошибка все-равно появляется( Может еще ка можно исправить???

    ОтветитьУдалить
  6. Возможно, у вас другая ошибка (посмотрите как следует Windows Event Viewer, там должен быть именно ServiceActivationException).
    Также, возможно, неправильно добавляете в web.config. Сама секция <system.serviceModel> должна быть внизу файла.

    ОтветитьУдалить
  7. По поводу web.config-там все есть и было. А по поводу событий пока ниче найти не могу(

    ОтветитьУдалить
  8. Thanks for the help! You pointed me in the right direction when I encountered something similar.

    http://johnmcavinue.ie/Blog/Sharepoint_2010_Designer_An_error_occurred_while_trying_to_fetch_data_from_your_Sharepoint_site

    ОтветитьУдалить
  9. Этот комментарий был удален автором.

    ОтветитьУдалить

Внимание! Реклама и прочий спам будут беспощадно удаляться.