Укажите поддерживаемые типы носителей при отправке "415 неподдерживаемых типов носителей"

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

Ответ 1

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

Ответ 2

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

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

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

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

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

Если это не был запрос 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.

Ответ 3

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

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

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

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

BTW, чтобы увидеть сгенерированный прокси-класс в VS, нажмите ссылку в Интернете, а затем нажмите кнопку "Показать все файлы" на панели инструментов. Ссылка .cs - это место радости!

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

Ответ 4

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

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

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