我正在使用VS 2015 with .Net 4.6.1。我正在尝试编写代码的集成测试,但它给了我上面的错误。我无法理解。此方法位于global.asax
中public void Application_EndRequest(object sender, EventArgs e)
{
AddCorsResponseHeadersForUnauthorizedRequests(Response, Request);
}
public static void AddCorsResponseHeadersForUnauthorizedRequests(HttpResponse response, HttpRequest request)
{
var origin = request.Params[AppConstant.RequestHttpOrigin];
if (response.StatusCode == (int) HttpStatusCode.Unauthorized &&
string.IsNullOrEmpty(response.Headers[AppConstant.AccessControlAllowOrigin]) &&
!string.IsNullOrEmpty(origin))
{
response.AddHeader(AppConstant.AccessControlAllowOrigin, WebApiConfig.GetCorsAllowedOrigin());
response.AddHeader(AppConstant.AccessControlAllowCredentials, "true");
}
}
IntegrationTest.cs
[TestFixture]
public class AuthenticationResponseHeadersTests
{
private WebApiApplication systemUnderTest;
private HttpRequest httpRequest;
private HttpResponse httpResponse;
[SetUp]
public void Setup()
{
systemUnderTest = new WebApiApplication();
httpRequest = new HttpRequest(string.Empty, "http://localhost:5001/", string.Empty);
httpResponse = new HttpResponse(TextWriter.Null);
httpResponse.AddHeader("Connection", "keep-alive");
}
[Test]
public void ShouldAddCorsResponseHeaders()
{
httpResponse.StatusCode = (int)HttpStatusCode.Unauthorized;
WebApiApplication.AddCorsResponseHeadersForUnauthorizedRequests(httpResponse, httpRequest);
Assert.AreEqual("http://localhost:5001", httpResponse.Headers[AppConstant.AccessControlAllowOrigin]);
Assert.AreEqual("true", httpResponse.Headers[AppConstant.AccessControlAllowCredentials]);
}
}
我得到的错误是在条件下它试图获取Response.Headers的特定标头并且错误是,任何想法?为什么它需要IIS进行测试?
此操作需要IIS集成管道模式
答案 0 :(得分:1)
经典模式(IIS6及更低版本中的唯一模式)是IIS仅适用于ISAPI扩展的模式
另一方面,集成模式是IIS7中的一种新模式,其中IIS管道与ASP.NET请求管道紧密集成(即完全相同)
在解决方案资源管理器中选择Web应用程序项目节点,然后按F4并更改管道
顺便说一句,因为您使用的是Web API,所以不必担心HttpModule和HttpHandlers,因为它们的部分已在集成管道模式的Web配置中进行了更改。
UPDATE 我会建议使用IHttpContext,并为他们编写自己的包装器,比如说IHttpContext。然后你就拥有自己的HttpContext并委托对它的所有调用。然后在您的应用程序中每个人都使用该界这解决了与微软密封类交互的问题,因为你可以替换模拟或存根或其他任何东西。