Укажите поддерживаемые типы мультимедиа при отправке 415 неподдерживаемого типа мультимедиа

Если клиенты отправляют данные в неподдерживаемом типе носителя на HTTP-сервер, сервер отвечает со статусом «415 неподдерживаемый тип носителя". Но как сообщить клиенту, какие типы носителей поддерживаются? Есть ли стандартный или хотя бы рекомендуемый способ сделать это? Или это будет просто записано в тело ответа в виде текста?


person deamon    schedule 27.07.2010    source источник
comment
Вы ожидаете заголовок ответа Accept, но Accept можно использовать только для запросов.   -  person Ronald Wildenberg    schedule 27.07.2010


Ответы (4)


В этом случае нет никакой спецификации того, что делать, поэтому ожидайте, что реализации будут повсюду. (Было бы разумно, если бы ответ сервера включал что-то вроде заголовка Accept:, поскольку он имеет в значительной степени правильную семантику, если в настоящее время в неправильном направлении.)

person Donal Fellows    schedule 27.07.2010
comment
Accept заголовки от сервера к клиенту - это то, что я ищу. Я с нетерпением жду HTTP 1.2 ;-) - person deamon; 27.07.2010

Я считаю, что вы можете сделать это с помощью глагола OPTIONS Http.

Также можно использовать код состояния 300 Multiple Choices, если ваш сценарий соответствует определенному варианту использования. Если они отправляют запрос с заголовком Accept из application/xml, а вы поддерживаете только text/plain и это представление живет по отдельному URL-адресу, вы можете ответить 300 и в заголовке Location URL-адрес этого представления. Я понимаю, что это может не совсем соответствовать вашему вопросу, но это еще один возможный вариант.

И из спецификации HTTP:

10.4.7 406 Неприемлемо

Ресурс, идентифицированный запросом, способен генерировать только объекты ответа, характеристики контента которых неприемлемы в соответствии с заголовками принятия, отправленными в запросе.

Если это не был запрос HEAD, ответ ДОЛЖЕН включать сущность, содержащую список доступных характеристик сущности и местоположений, из которых пользователь или пользовательский агент может выбрать наиболее подходящую. Формат объекта определяется типом носителя, указанным в поле заголовка Content-Type. В зависимости от формата и возможностей пользовательского агента выбор наиболее подходящего варианта МОЖЕТ выполняться автоматически. Однако эта спецификация не определяет какого-либо стандарта для такого автоматического выбора.

      Note: HTTP/1.1 servers are allowed to return responses which are
      not acceptable according to the accept headers sent in the
      request. In some cases, this may even be preferable to sending a
      406 response. User agents are encouraged to inspect the headers of
      an incoming response to determine if it is acceptable.
person Gandalf    schedule 27.07.2010
comment
Это сработает, за исключением того, что там нет спецификации содержания ответа. Возможно, это говорит вам, но откуда вы знаете? - person Donal Fellows; 27.07.2010
comment
Но какой заголовок следует использовать, чтобы указать, какие типы мультимедиа поддерживаются? Затем этот заголовок можно было бы использовать непосредственно в ответе 415. Обычно OPTIONS используется только для того, чтобы узнать, какие методы поддерживаются. - person deamon; 27.07.2010
comment
406 не имеет значения, так как это связано с несоответствием типа ответа. 415 — это то, что вы получаете, когда сервер не может обработать тип данных в теле запроса. (Я только что имел дело с этим в контексте веб-сервиса RESTful, который я разрабатываю, поэтому я уверен, что это правильная интерпретация.) Проблема в том, что сервер не может обрабатывать сообщение и клиент его уже отправляет; ошибка - единственная возможность (и нет способа дать правильный машиночитаемый способ сказать, что сработало бы). - person Donal Fellows; 27.07.2010

тл;др; Отредактирован сгенерированный класс прокси, чтобы он наследовался от Microsoft.Web.Services3.WebServicesClientProtocol**.

Я столкнулся с этим вопросом при устранении этой ошибки, поэтому я подумал, что помогу следующему человеку, который может прийти сюда, хотя и не уверен, что он отвечает на поставленный вопрос. Я столкнулся с этой ошибкой, когда в какой-то момент мне пришлось взять на себя существующее решение, в котором использовалось кодирование WSE и MTOM. Это был клиент Windows, вызывающий веб-службу.

К слову, клиент вызывал веб-службу, где он выдавал эту ошибку. Что-то, что способствовало устранению этой ошибки для меня, заключалось в проверке прокси-класса веб-службы, который, по-видимому, создается по умолчанию, чтобы наследоваться от System.Web.Services.Protocols.SoapHttpClientProtocol. По сути, это означало, что на самом деле он не использовал WSE3.

В любом случае я вручную отредактировал прокси-сервер и изменил его, чтобы он наследовался от Microsoft.Web.Services3.WebServicesClientProtocol.

Кстати, чтобы увидеть сгенерированный прокси-класс в VS, щелкните веб-ссылку, а затем нажмите кнопку «Показать все файлы» на панели инструментов. Reference.cs — это место радости!

Надеюсь, поможет.

person Sotiris Leventis    schedule 01.10.2014

В своей книге «Руководство разработчика HTTP» на странице 81 Крис Шифлетт объясняет, что означает ошибка 415, а затем добавляет: «Тип носителя, используемый в содержимом ответа HTTP, должен быть указан в заголовке объекта Content-Type».

1) Так возможен ли ответ Content-Type? Предположительно, это будет список допустимых типов контента, разделенных запятыми. Очевидная проблема с этой возможностью заключается в том, что Content-Type является заголовком сущности, а не заголовком ответа.

2) Или это опечатка в книге? Он действительно хотел сказать «HTTP-запрос»?

person james.garriss    schedule 12.12.2011
comment
Нет нет. Content-Type всегда определяет тип полезной нагрузки сообщения, как для запросов, так и для ответов (за исключением ответов HEAD...). - person Julian Reschke; 13.12.2011