检查HttpWebResponse的null

问题描述 投票:3回答:3

我正在向REST服务发出HTTP post请求,当我收到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
3个回答
2
投票

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

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

所以,像这样:

var webResponseStream = webResponse.GetResponseStream();

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

如果您想知道,webResponseStream != null会检查是否已将参考文献分配给变量webResponseStream,而webResponseStream != Stream.Null会检查分配给webResponseStream的Stream实例是否包含任何后备数据。


8
投票

没有从WebResponse派生的内置类型,特别是HttpWebResponse,可以返回null。这种迷信的信念误导了许多开发者。不要检查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的内容。


0
投票

你看起来不太对劲。 C#表格:

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);

我的第一个Web请求正常通过,第二个返回null。我甚至不知道错误在哪里。很明显它在代码中。而且C#代码也有自己的bug。

myRequestState.response.Close(); //myRequestState.response==null !!!

你不考虑标题,多线程等等。我建议你尝试自己编写Web处理程序并从服务器返回null。 Finnaly null

sysnem.threeding.nManualResetEvent allDone

有必要添加:

allDone.Reset();

enter code here

© www.soinside.com 2019 - 2024. All rights reserved.