Код, сгенерированный из шаблона Odata v4 Service T4 для клиентского прокси-сервера, не добавляет заголовок If-None-Match к запросу

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

Пример запроса, отловленного Fiddler:

PATCH / Пользователи (2) HTTP/1.1

кэш

Если совпадение: W/"J1Z1a2FzaWU3Bhc2IjJw=="

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

(пример из запроса:

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

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

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

@ Odata.etag=W/"J0MxRjIn")

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

ОБНОВИТЬ:

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

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

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

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

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

OnMessageWriterSettingsCreated (Аргументы действий);

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Производный класс.

Другие вопросы по тегам