Исходящий ответ от EventReceiver в SP 2019

Вопрос или проблема

У меня проблема с обработчиком событий (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 для дальнейшего анализа.

Оцените материал
Добавить комментарий

Капча загружается...