获取 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)。
如果我将客户端连接到的服务指向错误 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)。