我正在向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)));
}
答案 0 :(得分: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的内容。
答案 1 :(得分:2)
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
检查是否为Stream实例分配给webResponseStream
包含任何后备数据。
答案 2 :(得分:0)
您说的不对。 C#表格:
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
我的第一个Web请求正常通过,第二个返回null
。
我什至不知道错误在哪里。很明显,它在代码中。 C#代码也有自己的错误。
myRequestState.response.Close(); //myRequestState.response==null !!!
您不要考虑标题,多线程等,所以我建议您尝试自己编写Web处理程序并从服务器返回null
。
Finnaly null
在
sysnem.threeding.nManualResetEvent allDone
有必要添加:
allDone.Reset();
enter code here