.NET 中的 HTTP 支持

超文本传输协议(或 HTTP)是用于从 Web 服务器请求资源的协议。 该 System.Net.Http.HttpClient 类公开了从 URI 标识的资源发送 HTTP 请求和接收 HTTP 响应的功能。 Web 上有许多类型的资源可用,并且 HTTP 定义了一组用于访问这些资源的请求方法。

HTTP 请求方法

请求方法通过几个因素进行区分,首先通过谓词进行区分,但也可按以下特征进行区分

  • 如果请求方法可以多次成功处理,而不更改结果,则请求方法是 幂等 的。 有关详细信息,请参阅 RFC 9110:9.2.2。幂等方法
  • 请求方法是可 缓存 的,当其对应的响应可以存储以供重复使用。 有关详细信息,请参阅 RFC 9110:第 9.2.3 节。方法和缓存
  • 如果请求方法未修改资源的状态,则被视为 安全方法 。 所有 安全方法 也是 幂等方法,但并非所有 幂等 方法都被视为 安全方法。 有关详细信息,请参阅 RFC 9110:第 9.2.1 节。安全方法
HTTP 方法 是否是幂等的 可缓存 是否安全
GET ✔️ 是的 ✔️ 是的 ✔️ 是的
POST ❌ 否 ⚠️ 很少 ❌ 否
PUT ✔️ 是的 ❌ 否 ❌ 否
PATCH ❌ 否 ❌ 否 ❌ 否
DELETE ✔️ 是的 ❌ 否 ❌ 否
HEAD ✔️ 是的 ✔️ 是的 ✔️ 是的
OPTIONS ✔️ 是的 ❌ 否 ✔️ 是的
TRACE ✔️ 是的 ❌ 否 ✔️ 是的
CONNECT ❌ 否 ❌ 否 ❌ 否

POST仅当存在适当的Cache-Control标头或Expires响应标头时,该方法才可缓存。 在实践中,这种情况非常罕见。

HTTP 状态代码

.NET 使用 HttpClient 提供对 HTTP 协议的全面支持,该协议占据大多数 Internet 流量。 有关详细信息,请参阅 使用 HttpClient 类发出 HTTP 请求。 应用程序通过捕获 HttpRequestException 来接收 HTTP 协议错误。 如果调用的方法不返回响应消息,则 HTTP 状态代码会通过 HttpResponseMessageHttpResponseMessage.StatusCode 或通过 HttpRequestExceptionHttpRequestException.StatusCode 报告。 有关错误处理的详细信息,请参阅 HTTP 错误处理,有关状态代码的详细信息 ,请参阅 RFC 9110、HTTP 语义:状态代码

信息状态代码

信息状态代码反映临时响应。 例如 HttpStatusCode.Continue,大多数临时响应在内部通过 HttpClient 进行处理,并且永远不会向用户显示。

HTTP 状态代码 HttpStatusCode
100 HttpStatusCode.Continue
101 HttpStatusCode.SwitchingProtocols
102 HttpStatusCode.Processing
103 HttpStatusCode.EarlyHints

成功的状态代码

成功的状态代码指示已成功接收、理解和接受客户端的请求。

HTTP 状态代码 HttpStatusCode
200 HttpStatusCode.OK
201 HttpStatusCode.Created
202 HttpStatusCode.Accepted
203 HttpStatusCode.NonAuthoritativeInformation
204 HttpStatusCode.NoContent
205 HttpStatusCode.ResetContent
206 HttpStatusCode.PartialContent
207 HttpStatusCode.MultiStatus
208 HttpStatusCode.AlreadyReported
226 HttpStatusCode.IMUsed

重定向状态代码

重定向状态代码要求用户代理采取措施来满足请求。 默认情况下,自动重定向默认开启,可以通过 HttpClientHandler.AllowAutoRedirectSocketsHttpHandler.AllowAutoRedirect 来进行更改。

HTTP 状态代码 HttpStatusCode
300 HttpStatusCode.MultipleChoicesHttpStatusCode.Ambiguous
301 HttpStatusCode.MovedPermanentlyHttpStatusCode.Moved
302 HttpStatusCode.FoundHttpStatusCode.Redirect
303 HttpStatusCode.SeeOtherHttpStatusCode.RedirectMethod
304 HttpStatusCode.NotModified
305 HttpStatusCode.UseProxy
306 HttpStatusCode.Unused
307 HttpStatusCode.TemporaryRedirectHttpStatusCode.RedirectKeepVerb
308 HttpStatusCode.PermanentRedirect

客户端错误状态代码

客户端错误状态代码指示客户端的请求无效。

HTTP 状态代码 HttpStatusCode
400 HttpStatusCode.BadRequest
401 HttpStatusCode.Unauthorized
402 HttpStatusCode.PaymentRequired
403 HttpStatusCode.Forbidden
404 HttpStatusCode.NotFound
405 HttpStatusCode.MethodNotAllowed
406 HttpStatusCode.NotAcceptable
407 HttpStatusCode.ProxyAuthenticationRequired
408 HttpStatusCode.RequestTimeout
409 HttpStatusCode.Conflict
410 HttpStatusCode.Gone
411 HttpStatusCode.LengthRequired
412 HttpStatusCode.PreconditionFailed
413 HttpStatusCode.RequestEntityTooLarge
414 HttpStatusCode.RequestUriTooLong
415 HttpStatusCode.UnsupportedMediaType
416 HttpStatusCode.RequestedRangeNotSatisfiable
417 HttpStatusCode.ExpectationFailed
418 我是一个茶壶 🫖
421 HttpStatusCode.MisdirectedRequest
422 HttpStatusCode.UnprocessableEntity
423 HttpStatusCode.Locked
424 HttpStatusCode.FailedDependency
426 HttpStatusCode.UpgradeRequired
428 HttpStatusCode.PreconditionRequired
429 HttpStatusCode.TooManyRequests
431 HttpStatusCode.RequestHeaderFieldsTooLarge
451 HttpStatusCode.UnavailableForLegalReasons

服务器错误状态代码

服务器错误状态代码指示服务器遇到阻止其满足请求的意外条件。

HTTP 状态代码 HttpStatusCode
500 HttpStatusCode.InternalServerError
501 HttpStatusCode.NotImplemented
502 HttpStatusCode.BadGateway
503 HttpStatusCode.ServiceUnavailable
504 HttpStatusCode.GatewayTimeout
505 HttpStatusCode.HttpVersionNotSupported
506 HttpStatusCode.VariantAlsoNegotiates
507 HttpStatusCode.InsufficientStorage
508 HttpStatusCode.LoopDetected
510 HttpStatusCode.NotExtended
511 HttpStatusCode.NetworkAuthenticationRequired

另请参阅