2014-10-04 9 views
0

Я сделал службу WebAPI 2 с протоколом OData v4, используя классы ODataController и поддерживая проверку параллелизма в Entity Framework. Код для клиентской стороны создается с использованием шаблона Odata Client T4. Этот код генерирует прокси-классы и контейнерный класс, полученные из DataServiceContext, который обрабатывает отслеживание объектов, анализирует запрос LINQ в URL-адресах Odata и т. Д. Когда отслеживаемый объект (который содержит свойство, проверенное на параллелизм) обновляется, контейнерный класс при вызове SaveChangesAsync methos генерирует HTTP PATCH который содержит заголовок If-Match со значением, полученным от последнего запроса для этого объекта, и это работает нормально.Код, созданный с помощью Odata v4 Шаблон Service T4 для клиентского прокси не добавляет If-None-Match заголовок для запроса запроса

Пример запроса на Скрипаче пойманной:

ЗАПЛАТА/Пользователи (2) HTTP/1,1

Кэш

If-Match: Вт/"J1Z1a2FzaWU3Bhc2IjJw =="

Но в случае, если контейнер делает запрос для объекта, он генерирует правильный HTTP-запрос GET

(пример из заявок т:

GET/Животные (8) HTTP/1.1)

но без If-None-Match заголовок, даже если в последнем запросе, сервис отправки значение Etag в ответ

(пример из ответа:

@ odata.etag = W/"J0MxRjIn")

можно ли добавить If-None-Match заголовок путем установки контекста контейнера свойств конфигурации requestpipeline или каким-либо другим способом? Просто добавьте примечание - в случае, если служба получает значение etag в заголовке If-None-Match запроса GET, он должен вернуть код состояния 304 NotModified в случае соответствия значения этага (что означает, что объект не изменен), в противном случае служба отправляет свойства объекта в ответ тело.

UPDATE:

Я пытался добавить If-None-Match путем обработки SendingRequest2, это позволяет мне добавить If-None-Match заголовок вручную, но в этом случае, когда служба приема запроса и читает ETag из него, если сущность не изменена (соответствия etag), ответ будет иметь статус-код 304 - NotModified и контейнер (экземпляр производного класса DataServiceContext) не смогут обрабатывать этот ответ, потому что он ожидает сообщения сущности в теле, чтобы он генерировал исключение. Я могу обработать исключение и использовать его для подтверждения того, что объект не был изменен, но это не оптимизированный способ программирования. Мне нужен способ получить информацию о событиях запроса и ответа. В конвейере запроса я бы добавил etag к одному запросу запроса, а в конвейере ответа я обработал бы принятый код состояния 304 - NotModified.

Список context.Configuration.RequestPipeline is:

OnEntityReferenceLink (Действие);

OnEntryEnding (Действие);

OnEntryStarting (Действие);

OnMessageWriterSettingsCreated (Action args);

OnNavigationLinkEnding (Действие);

OnNavigationLinkStarting (Действие);

и список context.Configuration.ResponsePipeline является:

OnEntityMaterialized (Действие действия);

OnEntryEnded (Действие);

OnEntryStarted (действие);

OnFeedEnded (действие);

OnFeedStarted (действие);

OnMessageReaderSettingsCreated (Action messageReaderSettingsAction);

OnNavigationLinkEnded (действие);

OnNavigationLinkStarted (действие);

ответ

1

Добавление следующий код, прежде чем отправить запрос должен работать:

context.SendingRequest2+= (sender, eventArgs) => 
{ 
    eventArgs.RequestMessage.SetHeader("If-None-Match", "xxxxxxx"); 
}; 

, в котором context это имя экземпляра из DataServiceContext-х производного класса.