获取 0 的 HttpStatusCode

Getting a HttpStatusCode of 0

如果我将客户端连接到的服务指向错误 URL。

,为什么我得到的 HttpStatusCode 为 0

我的 statusCodeAsInt 显示为 0。为什么它没有显示为 404 并被处理?

IRestResponse response = client.Execute(restReq);
HttpStatusCode statusCode = response.StatusCode;

var statusCodeAsInt = (int) statusCode;

        if (statusCodeAsInt >= 500)
        {
            throw new InvalidOperationException("A server error occurred: " + response.ErrorMessage, response.ErrorException);
        }
        if (statusCodeAsInt >= 400)
        {
            throw new InvalidOperationException("Request could not be understood by the server: " + response.ErrorMessage,
                response.ErrorException);
        }

处理这个 RestResponse 的正确方法是什么?

响应代码 0 通常表示响应为空 - 即甚至没有返回 headers。

这通常发生在连接被接受,然后正常关闭时,也称为 FIN 连接。这是服务器声明它已完成向您广播的地方,但将继续收听新消息。 可能是防火墙问题。

另一件事是将IRestResponse更改为RestResponse。在这种情况下使用 IRestResponse 没有任何优势。

在我的例子中,这不是导致 StatusCode 为 0 的防火墙问题。我们使用的旧版应用程序仍在阻止 TLS 1.0 连接的服务器上使用 TLS 1.0。启用 TLS 1.2 后,我们得到了预期的状态代码。

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

我认为statuscode 为0 表示没有状态码。这也可能意味着错误出在 RestSharp 中,而不是响应中。状态码为 0 时,请求可能还没有发送。

检查 .ErrorException / .ErrorMessage。

在我的例子中,我只是指定了一个无效的主机名。

在我的例子中,使用证书认证,配置的证书是错误的。希望对您有所帮助。

我从防火墙后面的服务器收到间歇性响应 0。 以下代码解决了我的问题

client.ConfigureWebRequest((r) =>
        {
          r.ServicePoint.Expect100Continue = false;
          r.KeepAlive = true;
        });

您可以在 Windows 表格上试试这个:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

谢谢@KJ3

如果这条线不行

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

那就试试这个

System.Net.ServicePointManager.ServerCertificateValidationCallback = (senderX, certificate, chain, sslPolicyErrors) => { return true; };
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

这应该有效。

如果我在 post 请求期间遇到 StatusCode 0 问题,那么我将使用这两行代码。

HttpStatusCode 由处理您的 HTTP 请求的 server/service 设置。如果您发出无法解析为有效 server/service(错误 URL、端口、安全协议等)的请求,您根本无法访问处理该请求的 Http 请求处理器,并且没有执行以设置 HttpStatusCode 的代码 - 因此整数类型的默认值为 0。如果您试图捕获这种情况,请确保您捕获了客户端请求(在客户端代码中)的超时异常并将 Httpcode 设置为告诉您发生了什么的内容。我喜欢 HttpStatusCode 503 或 504(服务不可用或网关超时),尽管服务器可以出于其他原因使用这些代码进行响应,因此它们有点模棱两可。否则,只需将 0 的 Httpcode 视为由于某些与网络相关的原因而无法到达 server/service(再次像没有有效的 URL)。