集成测试 - 此操作需要IIS集成管道模式

3

我正在使用带有.Net 4.6.1的VS 2015。 我试图为一段代码编写集成测试,但是它给了我以上错误。 我无法理解。此方法位于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]);
        }
    }

我收到的错误是在 if 条件语句中,它试图获取 Response.Headers 的特定标头,错误是什么?任何想法吗?为什么 Test 需要 IIS?

此操作需要 IIS 集成管道模式

enter image description here


你的流程是什么? - Pouya Samie
@PouyaSamie 我正在使用IIsExpress,但我可以部署到完整的IIs上并检查是否修复了错误。 - Kamran Pervaiz
1个回答

1

经典模式(IIS6及以下唯一模式)是一种仅使用ISAPI扩展的模式。

集成模式则是IIS7中的新模式,其中IIS管道与ASP.NET请求管道紧密集成(即完全相同)。

在解决方案资源管理器中选择Web应用程序项目节点,按F4并更改您的管道enter image description here

顺便说一下,因为您正在使用Web API,所以不必担心HttpModule和HttpHandlers,因为它们的部分已在集成管道模式下更改了。

更新我建议使用IHttpContext并编写自己的包装器,带有像IHttpContext这样的接口。然后您只需要自己的HttpContext并将所有调用委托给它。然后在您的应用程序中,每个人都使用接口。这解决了与Microsoft封闭类交互的问题,因为您可以替换模拟或存根或其他内容。

请查看此链接: http://haacked.com/archive/2007/09/09/ihttpcontext-and-other-interfaces-for-your-duck-typing-benefit.aspx/


我正在使用IISExpress,我需要使用完整的IIS吗?既然所有东西都是本地主机,那么我可以尝试在IIS中创建一个网站。 - Kamran Pervaiz
没有什么表达式可以做到这一点...更改管道,然后你就没问题了。 - Pouya Samie
实际上,我刚刚验证了一下,我的属性中确实已经集成了管道,匿名已禁用,Windows 已启用。 - Kamran Pervaiz
我需要在app.config文件中写些什么吗?还是在integrationTest项目中? - Kamran Pervaiz
检查我的更新。 - Pouya Samie
1
我不想写太多的代码来测试响应头...我以为可以这样搞定。HttpRequest 和 HttpResponse 只是类,不应该依赖于 IIS。 - Kamran Pervaiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接