Создание SPListItem в службе WCF, развернутой в SharePoint - PullRequest
0 голосов
/ 02 декабря 2009

У меня есть следующий метод в службе WCF, которая была развернута в SharePoint с помощью руководства Шейла Малика:

[OperationContract]
public string AddItem(string itemTitle, Guid? idOfListToUse)
{
  using (var portal = new SPSite(SPContext.Current.Site.Url, SPContext.Current.Site.SystemAccount.UserToken))
  {
    using (var web = portal.OpenWeb())
    {          
      Guid listId;

      web.AllowUnsafeUpdates = true;

      if (idOfListToUse != null && idOfListToUse.Value != new Guid())
      {
        listId = idOfListToUse.Value;
      }
      else
      {
        try
        {
          listId = new Guid(web.Properties[PropertyBagKeys.TagsList]);
        }
        catch (Exception ex)
        {
          throw new MyException("No List Id for the tag list (default list) has been found!", ex);
        }
      }

      var list = web.Lists[listId];

      string title = "";

      SPSecurity.RunWithElevatedPrivileges(delegate{
        var newItem = list.Items.Add();
        newItem["Title"] = itemTitle;
        newItem.Update();
        title = newItem.Title;
      });

      web.AllowUnsafeUpdates = false;

      return title;
    }
  }
}

Когда метод вызывается из Javascript (с использованием отличного ServiceProxy.js Рика Страла), он завершается ошибкой, и это происходит в newItem.Update () из-за ValidateFormDigest ().

Вот кикер, хотя, когда я перебираю код, он работает! Никаких исключений!

Ответы [ 3 ]

1 голос
/ 02 декабря 2009

Хорошо, нашел ответ (есть 2 четных :-D)

Во-первых, грязный:

Установить FormDigestValidatedProperty в контексте:

HttpContext.Current.Items["FormDigestValidated"] = true;

Во-вторых, немного менее грязная версия (в основном оставляющая путь для атак XSS, но в любом случае это интранет)

Ответ

0 голосов
/ 02 декабря 2009

Колин, это действительно плохая идея - пытаться получить доступ к HttpContext (также SPContext) внутри службы WCF. Смотрите здесь: MSDN: службы WCF и ASP.NET

Из статьи:

HttpContext: ток всегда равен нулю при доступе из WCF сервис.

Вероятно, это является причиной вашей проблемы.

РЕДАКТИРОВАТЬ: я заметил, что вы пытаетесь использовать SPContext, чтобы получить URL-адрес семейства сайтов. Я также не нашел хорошего решения для этого, поэтому я просто отправляю URL целевого семейства сайтов в качестве параметра для вызова службы. Не самое оптимальное решение, но я не мог придумать лучшего пути. Также, если вам нужно проверить аутентификацию / идентификационные данные и т.д., используйте ServiceSecurityContext.Current.

0 голосов
/ 02 декабря 2009

Я не думаю, что вы можете получить доступ к «списку», так как он был создан за пределами повышенного блока кода.

http://blogs.pointbridge.com/Blogs/herzog_daniel/Pages/Post.aspx?_ID=8

Полагаю, когда вы шагаете, хотя весь процесс находится в режиме администратора, поэтому все повышены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...