获取HttpStatusCode为0

35

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

10个回答

24

在我的情况下,造成状态码为0的问题并不是防火墙的原因。我们正在使用一款仍在使用TLS 1.0的旧应用程序,并且该服务器已经阻止了TLS 1.0连接。一旦启用了TLS 1.2,我们就得到了我们所期望的状态码。

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

23

0的响应代码通常意味着响应为空 - 也就是说,甚至没有返回头信息。

这通常发生在接受连接后,平稳关闭连接时,也称为FIN连接。即服务器声明已经向您广播完毕,但将继续监听新消息。可能是防火墙问题。

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


3
还需要注意的是,只有当请求命中有效的Web服务器时,才会发生404错误。Web服务器创建“404”状态代码。 - BinaryEvolved
1
谢谢,这很有帮助。 - obizues

14

我认为状态码0表示没有状态码。 它也可能意味着错误出现在RestSharp中,而不是响应中。 如果状态码为0,则请求甚至可能未被发送。

检查是否存在.ErrorException / .ErrorMessage。


4
太好了,这帮了我很多! - tkarls
它帮助我弄清楚这是一个证书问题。 - Giorgos Betsos

4

您可以在Windows窗体上尝试此操作:

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

感谢 @KJ3

0
如果这行代码不起作用
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问题,那么我会使用这两行代码。


0
在我的情况下,我只是指定了一个无效的主机名。

0

HttpStatusCode是由处理您的HTTP请求的服务器/服务设置的。如果您发出的请求无法解析为有效的服务器/服务(错误的URL、端口、安全协议等),则您就无法访问处理该请求的Http请求处理器,也没有执行任何代码来设置HttpStatusCode - 因此整数类型的默认值为0。如果您试图捕获此条件,请确保在客户端请求(在客户端代码中)上捕获超时异常并将Httpcode设置为告诉您发生了什么的某些内容。我喜欢HttpStatusCode 503或504(服务不可用或网关超时),尽管服务器可以以其他原因响应这些代码,因此它们略微模糊。否则,只需将Httpcode 0视为由于某些与网络相关的原因(例如没有有效的URL)而无法到达服务器/服务的失败。


0
在我的情况下,使用证书认证时,配置的证书是错误的。希望这可以帮助到您。

0

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

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

0
如果你正在使用RestSharp,Method.Get请求请确保不设置Header "Content-Type": "application/json"。因为RestSharp会抱怨Method.Get请求不能在其请求中有任何内容。另外,尝试设置ThrowOnAnyError = true以查看更详细的错误信息(如果有的话)。
// Init Rest Client
var options = new RestClientOptions("https://SomeDomain.com")
{
    MaxTimeout = -1,
    RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true,
    ThrowOnAnyError = true
};
var client = new RestClient(options);

请将代码作为文本发布,并使用代码格式选项。在 StackOverflow 上不允许使用代码的屏幕截图。请编辑您的回答并修复此问题。将来请注意这一点 :) - AztecCodes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接