Загрузка библиотеки документов журнала с httpmodule
-
16-10-2019 - |
Вопрос
Я застрял здесь с проблемой, которая оставляет меня ошеломленным. Я пишу HTTPModule, который проверяет URL -адрес всех HTTP -запросов, чтобы войти в систему, какой пользователи загружают каждый документ в библиотеке документов. Все работает так, как должно войти в машину сервера. Однако при входе в систему с другой машины в сети кажется, что иногда HTTP вообще не используется.
Восхождение на все HTTP -запросы при входе на сервер я получаю запрос на URL -адрес http: //portal.customer.local/reports/reportslib/xsht2.xlsx Всякий раз, когда загрузка документа. При просмотре документов с другого компьютера в сети обычно появляется этот запрос. Однако при просмотре офисного документа иногда возникает запрос http: //portal.customer.local/reports/_vti_bin/cellstorage.svc/cellstorageservicentlm вместо. Я подумал, что это может быть какая -то функция обслуживания, и, конечно же, при изучении заголовка этого запроса я нахожу поле
SOAPAction=%22http%3a%2f%2fschemas.microsoft.com%2fsharepoint%2fsoap%2fICellStorages%2fExecuteCellStorageRequest%22
Поэтому я предполагаю, что SOAP каким -то образом привыкает к возвращению документа, возможно, если оно было где -то кэшировано или есть какое -то особое соединение с участием офисного приложения.
Итак, вопрос с двумя частями:
(1) У кого -нибудь есть идея, что здесь на самом деле происходит? Есть ли способ обойти это?
(2) Должен быть какой -то более простой способ сделать это. Моя цель - просто регистрировать имя документа и имя пользователя всякий раз, когда был загружен документ. Есть что -то, что я упускаю из виду?
class FileDownloadedEvent : IHttpModule
{
public void Init(HttpApplication context)
{
// Register event handler to be called after every page request
context.PostAuthenticateRequest += ContextPostAuthenticateRequest;
}
static void ContextPostAuthenticateRequest(object sender, EventArgs e)
{
var app = sender as HttpApplication;
if (app != null)
{
string requesturl = app.Request.Url.ToString();
// Inspect request url to see whether it's a request to download a document from the document library
if (requesturl.StartsWith(Utils.reportsLibraryUrl) && (!requesturl.Contains(".aspx")) && (!requesturl.EndsWith("/")))
{
SPWeb web = SPContext.Current.Web;
String fileName = requesturl.Substring(Utils.reportsLibraryUrl.Length);
// Call event handler action to register downloaded document
web.AllowUnsafeUpdates = true;
EventHandlerActions.documentDownloaded(web, requesturl, fileName);
web.AllowUnsafeUpdates = false;
}
}
}
public void Dispose() { }
}
Решение
Вы можете включить аудит на «Просмотр» событий Splistitem. Тогда вы можете запрос с чем -то вроде:
SPSite site = ...
SPListItem item = ...
SPAuditQuery query = new SPAuditQuery(site);
query.RestrictToListItem(item);
SPAuditEventType[] eventTypes = new SPAuditEventType[] { SPAuditEventType.View };
SPAuditEntryCollection auditLog = site.Audit.GetEntries(query);
Другие советы
Похоже, вы изобретаете колесо. SharePoint поставляется с инфраструктурой аудита, которая, несмотря на недостаток, вероятно, даст вам то, что вам нужно.
Посмотрите на следующее:
- При использовании WSS3 или SharePoint Foundation вы не получите пользовательский интерфейс, поэтому вам понадобится установить и запросить его программно. Анкет (Статья 2007 года, но она работает так же в 2010 году)
- Использование Moss 2007 или SharePoint Server 2010 Вы получаете встроенную функциональность. Анкет Репортаж может быть немного глюкой, хотя.
- Получите сторонний компонент Это делает все это для вас, независимо от вашей среды SharePoint и без всех ошибок.
Обратите внимание, что ссылка на сторонний компонент указывает на продукт, над которым я работал, поэтому применяются обычные отказы от ответственности.