基于ASP.NET获取WebRequest对象状态码并在单元测试中验证200状态的方法
问题分析与解决方案
我来帮你搞定这两个问题——先修复你的测试用例,再讲清楚ASP.NET里怎么正确获取WebRequest的状态码。
一、修复你的测试用例
你的代码里有几个小问题导致断言会失败,我帮你调整一下:
- 重复调用
GetResponse():你在try块外面已经调用了一次,里面又调用,这会导致请求重复发送或者报错,得去掉外面的调用。 - 类型不匹配的断言:你把
StatusCode转成了字符串,但HttpWebResponse.OK是枚举值,直接比较肯定不匹配,要保持枚举类型来对比。 - 资源释放优化:用
using语句自动释放HttpWebResponse,比手动Close()更安全,避免资源泄漏。
修正后的代码如下:
public void DataControllerTest_NoData(long dataId) { var uri = "http://localhost:8311/api/Data?columnId=" + dataId; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.Headers.Add("Authorization", "Bearer " + token); request.Method = "GET"; HttpStatusCode statusCode = HttpStatusCode.InternalServerError; // 初始化默认值 try { using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { statusCode = response.StatusCode; } } catch (WebException we) { if (we.Response != null) { using (HttpWebResponse errorResponse = (HttpWebResponse)we.Response) { statusCode = errorResponse.StatusCode; } } } // 直接用枚举值对比,不需要转字符串 Assert.AreEqual(HttpStatusCode.OK, statusCode); }
二、ASP.NET中获取WebRequest状态码的正确方式
在ASP.NET里使用HttpWebRequest获取状态码要分两种情况:
- 正常成功请求:当接口返回200、201这类成功状态码时,直接调用
request.GetResponse()拿到HttpWebResponse,然后读取它的StatusCode属性(类型是HttpStatusCode枚举)即可。 - 异常状态码(如404、500):当接口返回非2xx的状态码时,
GetResponse()会抛出WebException。这时候需要从WebException的Response属性中取出响应对象,转成HttpWebResponse后再获取StatusCode。
注意一定要用using语句包裹HttpWebResponse,确保响应资源被正确释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者BenTen
相关产品推荐
相关产品推荐

