I am making HTTP post request to REST service, When I get the HttpWebResponse back, I am doing below check. Should I also check responseStream != null when I am doing webresponse != 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)));
}
No built-in type derived from
WebResponse
, in particularHttpWebResponse
, can return null. This superstitious belief has misled many developers. Don't check for null. Such code is dead code.What would null even mean compared to returning an empty stream?! This does not make sense.
Also,
GetResponse()
cannot return null. Again, what is that supposed to mean?! The HTTP protocol does not support the notion of a "null response". If that ever happens due to a library bug it's not possible to handle that situation anyway. Any such check does not help.It is possible to create classes derived from
WebResponse
that return an insane values such asnull
. No built-in class does that and it should be considered a bug to returnnull
. Classes derived fromWebResponse
are very rare. I have never seen one.Here's a good code pattern to use:
It demonstrates how to succinctly and safely read the contents of an HTTP URL using
HttpWebRequest
.You are not right. C# Forms:
My first web request passes normally, the second returns
null
. I do not even know where the error is. It is clear that it is in the code. And the C# code has its own bugs too.You do not consider headings, multithreading etc., etc. I advise you to try to write the web handler yourself and return
null
from server. Finnalynull
was inIt was necessary to add:
enter code here
HttpWebResponse.GetResponseStream()
can return null, so yes, you should check whether it is null or not.You should also check whether
HttpWebResponse.GetResponseStream() == Stream.Null
So, something like this:
In case you're wondering,
webResponseStream != null
checks for whether a reference to a Stream has been assigned to the variablewebResponseStream
, whereaswebResponseStream != Stream.Null
checks whether or not the Stream instance assigned towebResponseStream
contains any backing data.