Я разрабатываю приложение Host Provider SharePoint 2013, используя javascript REST Api. Чтобы выполнять операции создания (POST) или обновления (MERGE) для элементов sharepoint, мне нужно установить заголовок "X-RequestDigest" с запросом.
Когда в приложениях, поддерживающих SharePoint, я смог использовать службу http://contoso.sharepoint.com/SharePointHostedApp/_api/contextinfo для получения значения дайджеста запроса; тем не менее, у меня возникают проблемы с получением этого значения, когда в хост-приложении поставщика.
Первое отличие от размещенного провайдера заключается в том, что теперь нам нужно сделать кросс-доменный запрос, так как мы не работаем на сайте sharepoint, а в другом домене, размещенном на другом сервере. Чтобы быть ясным: вместо
$.ajax({
url: appWebUrl + '/_api/contextinfo',
method: "POST",
headers: { "Accept": "application/json; odata=verbose" }
})
Я предположил, что нам нужно использовать SP.RequestExecutor
для выполнения запроса на перекрестный домен.
Когда я создаю запрос, он выглядит следующим образом (я изменил фактические URL-адреса на что-то фальшивое, но в основном мы говорим прокси, чтобы использовать хост-сеть с целью и получить конечную точку /_api/contextinfo
):
https://contoso-6f921c6addc19f.sharepoint.com/ProviderHostedApp/_api/SP.AppContextSite(@target)/[email protected]=%27https://contoso.sharepoint.com%27
Однако я получаю эту ошибку: Cannot find resource for the request contextinfo.
означает, что конечная точка не существует.
Я старался использовать метод POST с правильными заголовками application/json;odata=verbose
с пустым телом.
Как получить значение дайджеста запроса из службы /_api/contextinfo
для хостинга приложения поставщика?
Основываясь на том, что я исследовал:
- Мы не можем использовать
$('#__REQUESTDIGEST').val()
; потому что это недоступно для размещенного провайдера приложения. - Нам нужно использовать некоторые из кросс-доменного запроса, так как я запускаю за пределами sharepoint.
- Я попытался установить цель междоменного запроса как hostWebUrl, так и appWebUrl, и обе дают ту же ошибку.
Должен быть какой-то способ получить это значение, иначе мы будем ограничиваться только чтением операций при использовании JavaScript. Кто-нибудь еще решил это с помощью javascript?
Технически я мог бы попытаться внедрить необходимые службы, используя CSOM на сервере, и разоблачить их с помощью WebAPI или WCF, но, похоже, нецелесообразно выполнять это.
UPDATE:
Я пошел дальше и попробовал добавить контроллер WebAPI, который предоставляет службу, которая извлекает значение дайджеста запроса. Это фактически возвращает значение дайджеста запроса; однако при попытке использовать это в заголовке будущих вызовов я получаю сообщение об ошибке: "The security validation for this page is invalid and might be corrupted. Please use your web browser Back button to try your operation again."
Я предполагаю, что значение дайджеста запроса содержит в нем некоторую информацию заголовка референта, которая указывает, что он был запрошен сервером; однако будущие запросы, сделанные с ним, принадлежат браузеру, и это несоответствие может быть приемлемой причиной для него недействительным.
Несколько заметок о попытке добавить контроллер webAPI. Я основывал свой код на этом примере: http://code.msdn.microsoft.com/SharePoint-2013-Perform-335d925b, но преобразовал его, чтобы использовать новый HttpClient. Я перегрузил метод Page_Load, сохранил contextTokenString в переменной, к которой мог получить доступ контроллер WebAPI, затем проанализировал/использовал его при запросе contextinfo.
Кто-нибудь знает, является ли это правильным диагнозом этой ошибки? Есть ли что-то закодированное в значении дайджеста запроса, которое предотвратило бы его получение, как я предположил?
Я также открыл связанный с этим вопрос на форумах MSDN, так как я отчаянно хочу найти ответ: http://social.msdn.microsoft.com/Forums/sharepoint/en-US/f601fddd-3747-4152-b2d1-4e89f0a771c4/question-about-limitation-of-providerhosted-apps-is-it-possible-to-make-rest-calls-with-javascript?forum=sharepointdevelopmentprevious
Мне очень сложно поверить, что это может быть ограничением поставщиков размещенных приложений, но, учитывая все проведенные тесты, я начинаю сомневаться в жизнеспособности приложений, размещенных в хостинге, когда вы хотите писать в javascript.
Прошу помощи!