Как вернуть HTTP 429?

Я реализую API с использованием WCF, и в спецификации указано, что при определенных обстоятельствах нужно возвращать HTTP 429.

Обычно я бы просто написал:

throw new WebFaultException(HttpStatusCode.NotFound);

Однако перечисление HttpStatusCode не содержит ошибки 429.

Я, очевидно, могу привести к перечислению

throw new WebFaultException((HttpStatusCode)429);

Однако я беспокоюсь, что это не даст правильного результата для приложения, вызывающего мой API.

Каков наилучший способ создать расширение HttpStatusCode и отправить действительные (но неподдерживаемые) статусы HTTP?


person Liath    schedule 25.03.2014    source источник
comment
Нашел эту слабо связанную ссылку. Он не отвечает на вопрос, но может предоставить справочную информацию: stackoverflow.com/questions/2022887/   -  person TypeIA    schedule 25.03.2014
comment
Какая спецификация требует отправки незарегистрированного кода состояния?   -  person Julian Reschke    schedule 25.03.2014
comment
@JulianReschke, если вы проверите, что спецификация HTTP 429 действительно является допустимым кодом - просто .NET не поддерживает его в перечислении   -  person Liath    schedule 25.03.2014
comment
@Liath: Джулиан работает над спецификацией HTTP. :-) tools.ietf.org/html/rfc6585#section-4 это предложение для HTTP/429.   -  person EricLaw    schedule 26.03.2014
comment
@JulianReschke, хотя 429 Too Many Requests не упоминается в RFC 2616, он упоминается в RFC 6585. FWIW, хотя я не использовал его с WCF, я обнаружил, что в ASP.NET установка HttpResponse.StatusCode на 429 привела к правильному число, но не правильная строка, поэтому необходимо также установить StatusDescription или просто установить Status. Я бы беспокоился, что WCF может получить аналогичный частично правильный результат из-за того, что он использует тот же фрагмент кода, что и ASP.NET.   -  person Jon Hanna    schedule 26.03.2014
comment
всем: извините, я забыл, что 429 действительно зарегистрированный код!   -  person Julian Reschke    schedule 26.03.2014


Ответы (3)


Из Спецификации языка C# 5.0:

Набор значений, которые может принимать тип перечисления, не ограничен его членами перечисления. В частности, любое значение базового типа перечисления может быть приведено к типу перечисления и является отдельным допустимым значением этого типа перечисления.

Так что это совершенно нормально и будет вашим лучшим выбором:

throw new WebFaultException((System.Net.HttpStatusCode)429);
person Derek W    schedule 25.03.2014
comment
Это нормально с точки зрения языка, но это не значит, что API справится с этим правильно... - person Thomas Levesque; 26.03.2014
comment
Исключение здесь выбрасывается из API. Ответственность за обработку этого исключения лежит на вызывающем объекте. - person Derek W; 26.03.2014
comment
Спасибо за это. Я хотел вернуть Locked 423. Приятно знать, что кастинг будет работать. - person John Henckel; 19.04.2016
comment
Я могу подтвердить, что этот тип приведения отлично работает в .NET Framework 4.8, где TooManyRequests явно не определен в перечислении HttpStatusCode. - person Paul Karkoska; 02.09.2020
comment
Сегодня я узнал - person Jaans; 04.12.2020

Если вы размещаете службу WCF с IIS, вы можете включить Режим совместимости с ASP.Net. После этого вы можете установить статус HttpContext.Current. Response.StatusCode на 429.

С этим сказано. Я думаю, что вам лучше всего попытаться привести 429 к HttpStatusCode и посмотреть, что произойдет. Если это сработает, вы можете избавить себя от головной боли.

person Josh    schedule 25.03.2014

Вы можете использовать HttpStatusCode напрямую

HttpStatusCode.TooManyRequests

person Teepi    schedule 26.11.2019
comment
Привет, Teepi. Не могли бы вы добавить немного больше информации? Перечисление было обновлено с тех пор, как я разместил вопрос, или это другой вопрос? - person Liath; 26.11.2019
comment
Это фактическое перечисление HttpStatusCode - person Teepi; 28.11.2019
comment
не существует в .net 4.7.2, возможно, вы захотите добавить, какую версию вы используете. - person Edwin Stoteler; 19.12.2019
comment
Framework до 4.8 не имеет перечисления 429, но оно присутствует в .NET Framework 5.0 Preview 7. Оно было добавлено в Standard и Core в версии 2.1. - person Joe Cullinan; 30.07.2020