我们可以创建自定义HTTP状态代码吗?

Raj*_*esh 77 c# asp.net wcf http wcf-rest

我有一个REST和WCF服务,并希望根据操作发送自定义状态代码.

某些验证失败然后我想发送HTTP 444的示例,当授权失败时,我想发送HTTP 455

问题是我们如何对SOAP和REST Web服务进行验证.

在客户端上,错误代码如何起作用,因为当您从WCF服务(使用SOAP)发送HTTP 400/500时,会在显示状态代码的客户端上抛出异常.

现在,如果我发送一个新的自定义状态代码,客户端如何处理这个?

Chr*_*sNY 100

是的,只要您尊重该类 - 即成功2xx,客户端错误4xx等等.因此,您可以为自己的应用程序的错误条件返回自定义4XX错误代码(最好是未分配的错误代码).

引用[RFC 2616] [1]:

"HTTP状态代码是可扩展的.不需要HTTP应用程序来理解所有已注册状态代码的含义,但这种理解显然是可取的.但是,应用程序必须理解任何状态代码的类,如第一个数字所示,并且处理任何无法识别的响应等同于该类的x00状态代码,但不能缓存无法识别的响应.例如,如果客户端收到无法识别的状态代码431,则可以安全地假设存在它的请求有问题,并将响应视为已收到400状态代码."

类'

  • 1xx:信息 - 收到请求,继续处理

  • 2xx:成功 - 该行动已成功接收,理解和接受

  • 3xx:重定向 - 必须采取进一步措施才能完成请求

  • 4xx:客户端错误 - 请求包含错误的语法或无法满足

  • 5xx:服务器错误 - 服务器无法满足明显有效的请求[1]:

http://tools.ietf.org/html/rfc2616#section-6.1.1

  • @ChrisNY:大多数Web应用程序都设计为使用单个客户端(您的javascript/ajax代码)和单个服务器(您的服务器),因此使用自定义状态代码是完全正常的.在这些情况下,"其他人"甚至不可能通过使用相同的状态代码来导致"破损". (17认同)
  • 除测试外,请勿使用未注册的状态代码. (2认同)
  • 这是一个断言.这可能是正确的,但为什么呢? (2认同)
  • 这句话并不是说你可以编写自己的代码,它说你的应用程序不需要知道每个注册代码是什么,只要它尊重代码类并为4xx等引发错误.除此之外,我能看到的唯一问题是,将来,其中一个代码会被正式分配,浏览器/ javascript功能可能会发生变化.例如494 DDNS攻击停止所有通信,浏览器可能会看到并阻止js启动任何更多的通信到该IP.极不可能,但你不能100%,Twitter似乎认为这可以做420增强你的平静 (2认同)

Jul*_*hke 31

我建议您不要创建自己的HTTP状态代码,只有在您的示例中您要执行的操作已存在适用的代码时.

来自https://tools.ietf.org/html/rfc4918#section-11.2:

422 [Unprocessable Entity]状态代码表示服务器理解请求实体的内容类型(因此415 [Unsupported Media Type]状态代码不合适),并且请求实体的语法正确(因此400 [错误请求] ]状态代码不合适)但无法处理包含的指令.例如,如果XML请求主体包含格式正确(即语法正确)但语义错误的XML指令,则可能发生此错误情况.

可以认为"无法处理"可能是由于验证错误.

  • 授权失败是401,而不是403. 403被禁止,授权不能解决问题. (10认同)
  • 401是关于失败*认证*(尽管名称). (4认同)
  • 401 是“请重新登录” (2认同)

fms*_*msf 18

是的,您可以添加自定义错误代码.如果可能,请使用已存在的代码,如果要声明新代码,请小心避免冲突.

您应该知道一些代理过滤未知代码.我遇到了用户问题,其中代理将5XX映射到500,而4XX映射到404.这使得我的ajax调用检查状态代码失败.


Anj*_*lva 16

这是所有可用/不可用HTTP代码的完整列表。

https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml

例如,以下带箭头的可用于族(因为它们未分配)4XX

在此处输入图片说明

我希望这可以帮助别人。

谢谢


Wil*_*ilt 14

某些应用程序会在600-799范围内添加自定义响应代码.例如,在此查看KeyNote的响应代码列表

主题定义的错误代码(600-799)

600: CONNECTION ERROR - This indicates a general connection error
601: INCOMPLETE ERROR - This indicates sever sends an incomplete page/object (as indicated by Content-Length header)
602: UNEXPECTED CLOSE ERROR - This indicates socket connection has been closed unexpectedly
603: REFUSED ERROR - This indicates a request to connect to the server is refused
604: TIMEOUT ERROR - This indicates there is no activity in socket connection in 3 minutes
605: REDIRECT ERROR - This indicates an error in redirect HTTP header
606: SSL ERROR - This indicates a general error in SSL
607: HEADER ERROR - This indicates a malformed HTTP header
608: EMPTY RESPONSE ERROR - This indicates server doesn't send any response after a request is sent
609: UNKNOWN HOST ERROR - This indicates socket receives an unknown host error from DNS
610: NO ROUTE TO HOST ERROR - This indicates a no route to host error was received while attempting to open a socket
611: SOCKET ERROR - This indicates a general socket error
612: FRAME LOOP ERROR - This indicates a page has a frame loop (frame A includes Frame B that includes Frame A)
613: REDIRECT LOOP ERROR - This indicates a page has a redirect loop (page A redirects to page B that redirects to page A)
614: CONNECTION RESET ERROR - This indicates socket receive a reset signal from the server
615: SOCKET PROTOCOL ERROR - This indicates an error in socket protocol
616: SOCKET BIND ERROR - This indicates an error in binding the socket
617: CONNECTION ERROR - This indicates a general socket connection error
618: CHUNK ERROR - This indicates an error in chunked encoding
619: SSL TIMEOUT - This indicates a timeout during SSL handshake (2 minutes)
620: SSL END OF INPUT - This indicates an end-of-file is received during SSL handshake
621: SSL HANDSHAKE ERROR - This indicates a general error during SSL handshake
622: SSL CERTIFICATE ERROR - This indicates an error in SSL certificate verification
623: SSL AUTHENTICATION ERROR - This indicates an authentication error during SSL handshake
624: SSL BAD MAC ERROR - This indicates a bad MAC during SSL handshake
625: SSL CIPHER ERROR - This indicates a cipher error during SSL handshake
701: ERROR TEXT FOUND - This code is returned if any error text (such as, "Service Unavailable") are found in the main page (frame HTML contents included). Note that the error text must be defined in advance of the test. Error text means if the text is found, this session should be considered a failure.
702: REQUIRED TEXT NOT FOUND - This code is returned If not all required texts are found in the main page. Note that required text must be defined in advance of the test. Required text means if the text is not found, this session should be considered a failure.
703: HTML BODY EMPTY - This code is returned if the HTML body of the page is empty (only if error text or required text has been defined).
Run Code Online (Sandbox Code Playgroud)

这是不是很好的做法,我不敢说,但至少这是一个有趣的参考.

  • @JulianReschke我甚至提到我"不敢说这是不是好习惯".我只是添加了对其他应用程序的引用.由于Keynote使用非法状态代码,我的回答是不合理的.我只是在讨论. (11认同)
  • 这些值是非法的,因为 HTTP 规范不允许任何超出 100...599 的值。 (4认同)

Aim*_*ast -19

不可以,只能使用rfc文档要求代码,具体参见RFC1945

  • 从技术上讲,你可以随心所欲地使用任何东西。只是不要指望它能与其他人一起很好地发挥作用。正如OP中所问的那样——如果拉杰什控制了所有客户,他可以让他们明白“1337 - 你们所有的基地都属于我们”,只要他们愿意。;) (6认同)
  • 您可以使用 http://www.iana.org/assignments/http-status-codes 中定义的任何状态代码。 (4认同)