Вопрос или проблема
У меня проблема с обработчиком событий (EventReceiver) в SharePoint OnPremise 2019.
Этот обработчик событий, разработанный в Visual Studio, запускается при добавлении файла в библиотеку документов.
Существует 3 события:
ItemAdding
ItemAdded
ItemUpdated
На событии ItemAdding мы проверяем, что загружаемый файл является ZIP-архивом, что у пользователя есть право на удаление файла и так далее.
И мы возвращаем пользовательское сообщение об ошибке через ctx.OutgoingResponse.
// проверка, является ли файл .ZIP
if (extension.ToUpper() != "ZIP")
{
var errorMsg = Tools.ResourceHelper.GetResource("ERRMSG_FILE_EXTENSION", ResourceFile);
properties.ErrorMessage = errorMsg;
properties.Status = SPEventReceiverStatus.CancelWithError;
throw new Exception(errorMsg);
}
catch (Exception ex)
{
string errorMessage = "Событие: ItemAdding " + ex.Message;
properties.ErrorMessage = errorMessage;
properties.Status = SPEventReceiverStatus.CancelWithError;
SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("FranceAssureurs.DepotZIP", TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, errorMessage, ex.StackTrace);
// Управление возвратом http ошибки
WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.InternalServerError;
ctx.OutgoingResponse.StatusDescription = ex.Message;
}
Мы добавляем файл в эту библиотеку из приложения Front на React, используя API SharePoint:
const url = `${this.props.library}/RootFolder/Files/Add(url="${file.name}", overwrite=true)`;
this.props.context.spHttpClient.post(url, SPHttpClient.configurations.v1, {
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: file
}).then((response: SPHttpClientResponse) => {
console.log(response);
if (response.status === 200) {
showSuccessMessage("Файл успешно загружен");
// обновление веб-части библиотеки документов
this.onUploadSuccess();
}
События выполняются правильно, когда файл добавляется.
В моих средах разработки и внутреннего тестирования все работает корректно, и сообщения об ошибках извлекаются из фронта с помощью следующего кода:
else {
let rep: string;
rep = response.statusText;
throw new Error(rep);
}
}).catch(error => {
this.input.value = "";
showErrorMessage("Ваш файл не смог быть загружен. Мы рекомендуем попробовать снова через 2 часа и связаться с нами, если проблема сохранится.");
});
Но в тестовых и производственных средах клиента сообщения не извлекаются, я всегда получаю пустое сообщение.
ctx.OutgoingResponse.StatusDescription = ex.Message;
Что может быть причиной этой разницы в ответе?
Я сравнил файлы web.config и не нашел ничего.
Настройки на уровне сервера IIS?
Опции SharePoint?
Спасибо за вашу помощь
Ответ или решение
Ваша проблема с обработчиком событий SharePoint 2019, связанная с получением пустых сообщений об ошибках в тестовой и производственной средах клиента, может быть вызвана несколькими факторами. Давайте рассмотрим возможные источники проблемы и решения.
1. Настройки IIS и свойства приложения
Проблема может заключаться в конфигурации IIS. Убедитесь, что настройки для обработки ошибок настроены корректно. Например, IIS может быть настроен на скрытие ошибок, что приводит к отсутствию детализированного описания ошибок в ответах.
-
Проверьте параметры
customErrors
в web.config:
Убедитесь, что вweb.config
установлены правильные параметры для отображения ошибок:<system.web> <customErrors mode="Off" /> </system.web>
- Проверьте настройку
httpErrors
в IIS:
Возможно, необходимо настроитьhttpErrors
для возврата подробной информации об ошибках.<system.webServer> <httpErrors errorMode="DetailedLocalOnly" /> </system.webServer>
2. Варианты конфигурации SharePoint
Сравните не только web.config
, но и настройки SharePoint на разных средах. Например, убедитесь, что уровень журналирования (diagnostic logging) одинаковый во всех средах.
- Проверьте, включен ли уровень диагностики ("Verbose") на клиентских системах. Разные уровни диагностики могут привести к выдаче различной информации об ошибках.
3. Проверка кода обработчика событий
Убедитесь, что код, который вызывает ctx.OutgoingResponse
, действительно выполняется. Если обработчик событий не может обратиться к объекту WebOperationContext
, это может быть причиной отсутствия сообщения.
4. Возвращение ошибок через SharePoint API
Убедитесь, что в коде клиента правильно обрабатываются статусы и сообщения. Иногда реакция клиента может не выдавать полную информацию. Попробуйте изменить обработку ответа в вашем JavaScript-коде следующим образом:
.then((response: SPHttpClientResponse) => {
if (response.status >= 200 && response.status < 300) {
showSuccessMessage("Файл успешно загружен");
this.onUploadSuccess();
} else {
throw new Error(response.statusText || "Неизвестная ошибка");
}
}).catch(error => {
this.input.value = "";
showErrorMessage(`Ваш файл не мог быть загружен: ${error.message || "Неизвестная причина"}`);
});
5. Тестирование и отладка
-
Логи: Проверьте журналы SharePoint на предмет ошибок, которые могут с этим быть связаны. Особенно интересуют проблемы, которые могут происходить при обработке события
ItemAdding
. - Логи IIS: Логи IIS могут предоставить информацию о том, какие ошибки происходят на уровне сервера.
6. Проверка прав доступа
Убедитесь, что у пользователя, под которым происходит загрузка, есть необходимые права. Неправильные или недостаточные разрешения также могут быть причиной отказа в выполнении событий.
Итог
Ваша задача – удостовериться, что между различными средами нет различий в конфигурации и что ошибки обрабатываются корректно. Все это может помочь в диагностике вашей проблемы и обеспечить единообразное поведение вашего обработчика событий в разных средах.
Если, после выполнения всех шагов, ваши проблемы не решены, рекомендуется провести детальное сравнение настроек между средами и, возможно, обратиться к технической поддержке Microsoft для дальнейшего анализа.