【问题标题】:Check null for HttpWebResponse检查 HttpWebResponse 的 null
【发布时间】:2014-05-20 05:38:58
【问题描述】:

我正在向 REST 服务发出 HTTP 发布请求,当我返回 HttpWebResponse 时,我正在执行以下检查。当我在做 webresponse 时,我是否也应该检查 responseStream != null != null

HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
if (webResponse != null)
{
    var responseStream = webResponse.GetResponseStream();
    int responseCode = (int)webResponse.StatusCode;
    if (responseStream != null && responseCode == (int)HttpStatusCode.Created)
    {
        cmsStoreWebResponse = ((new  StreamReader(responseStream)).ReadToEnd());`
    }
    else
    {
        this.LogError(string.Format("{0}\n Endpoint: {1}\n {2} {3} {4}", ErrorCodes.IWS_CMSRetrieve_ERROR_001, oagEndpointUrl, ErrorCodes.IWS_CMSStore_ERROR_SERVICE_DOWN, responseStream, responseCode));
        serviceData.Fatal = true;
        serviceData.ErrorCode = ErrorCodes.IWS_EFORMSFORMSETS_001;
        serviceData.ErrorDetails = string.Format("\nEndpoint: {0}\n {1}", oagEndpointUrl, ErrorCodes.RESPONSE_STREAM_NULL);
        throw new FaultException<ServiceExceptionData>(serviceData, new FaultReason(string.Format("\nEndpoint: {0}\n {1}", oagEndpointUrl, ErrorCodes.RESPONSE_STREAM_NULL)));
    }
}
else
{
    this.LogError(string.Format("{0}\n Endpoint: {1}\n {2}",  ErrorCodes.IWS_CMSRetrieve_ERROR_001, oagEndpointUrl, ErrorCodes.IWS_CMSStore_ERROR_SERVICE_DOWN));
    serviceData.Fatal = true;
    serviceData.ErrorCode = ErrorCodes.IWS_EFORMSFORMSETS_001;
    serviceData.ErrorDetails = string.Format("\nEndpoint: {0}\n {1}", oagEndpointUrl, ErrorCodes.RESPONSE_STREAM_NULL);
    throw new FaultException<ServiceExceptionData>(serviceData, new FaultReason(string.Format("\nEndpoint: {0}\n {1}", oagEndpointUrl, ErrorCodes.RESPONSE_STREAM_NULL)));
}

【问题讨论】:

    标签: c# wcf http rest


    【解决方案1】:

    HttpWebResponse.GetResponseStream()可以返回null,所以是的,你应该检查它是否为null。

    你还应该检查HttpWebResponse.GetResponseStream() == Stream.Null

    所以,是这样的:

    var webResponseStream = webResponse.GetResponseStream();
    
    if (webResponseStream != null && webResponseStream != Stream.Null)
    {
        //do stuff.
    }
    

    如果您想知道,webResponseStream != null 检查是否已将对 Stream 的引用分配给变量 webResponseStream,而 webResponseStream != Stream.Null 检查分配给 webResponseStream 的 Stream 实例是否包含任何支持数据。

    【讨论】:

    • 嗨,大脑,感谢您的回复。 webResponseStream != null 和 webResponseStream != Stream.Null 有什么区别
    • 嗨@user3456546,我已经更新了我的答案以反映您的后续问题。
    • 我从未见过有人与Stream.Null 相比。你能举一个与之比较的例子吗?
    • 这个答案是错误的。没有内置类型可以返回 null。与返回空流相比,这意味着什么?! Stream.Null 检查不足以检测空流。首先不需要检查空流。 => 不要检查 null、Stream.Null 或空流。
    • @usr 是的,你完全正确。不幸的是,我没有修改旧答案的习惯,否则我会在不久前修复这个问题。
    【解决方案2】:

    没有任何从WebResponse 派生的内置类型,尤其是HttpWebResponse,可以返回null。 这种迷信的信念误导了许多开发人员。不要检查空值。这样的代码是死代码。

    与返回空流相比,null 甚至意味着什么?!这没有意义。

    另外,GetResponse() 不能返回 null。 再说一遍,这应该是什么意思?! HTTP 协议不支持“空响应”的概念。如果由于库错误而发生这种情况,无论如何都无法处理这种情况。任何此类检查都无济于事。

    可以创建派生自WebResponse 的类,这些类返回疯狂的值,例如null。没有内置类会这样做,返回null 应该被视为一个错误。从WebResponse 派生的类非常少见。我从来没有见过。

    这是一个很好的代码模式:

    var request = WebRequest.Create("http://example.org/");
    
    using (var response = request.GetResponse())
    using (var responseStream = response.GetResponseStream())
    using (var responseReader = new StreamReader(responseStream))
    {
        var contents = responseReader.ReadToEnd();
    }
    

    它演示了如何使用 HttpWebRequest 简洁安全地读取 HTTP URL 的内容。

    【讨论】:

    • ReSharper 警告说它在 2021 年仍然“可能为空”。sigh
    • 也就是说,这表明在 HTTP 上使用 HttpWebRequest / 流的另一个失败:不尊重响应的字符集。带有“è”的 Windows-1252 会出现乱码:-/ 2021 年仍然存在.. 原因..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2017-08-08
    相关资源
    最近更新 更多