2016-12-07 81 views
2

我正在使用VS 2015与.Net 4.6.1。我正在尝试为代码编写集成测试,但它给了我上面的错误。我无法摆弄我的头。这种方法是在Global.asax中集成测试 - 此操作需要IIS集成管道模式

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集成的管线模式

enter image description here

+0

什么是你的管道? –

+0

@PouyaSamie我正在使用IIsExpress,但我可以将它部署在完整的IIs上,并检查它是否修复了错误。 –

回答

0

经典模式(仅在IIS6和下面模式)是其中仅IIS与ISAPI扩展工作的模式

集成模式是IIS7中的一种新模式,其中IIS管道与ASP.NET请求管道

紧密集成(即完全相同) 0

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

顺便说一句,因为你正在使用的Web API有没必要担心的HttpModule和HttpHandlers的,因为他们的部分已在集成管道模式下的web配置中更改。

UPDATE我会建议使用IHttpContext并为他们编写自己的包装,比如说说IHttpContext。然后您只需拥有自己的HttpContext并将所有调用委托给它。然后在你的应用程序中,每个人都使用该界面这解决了您与微软密封类交互的问题,因为您可以替代模拟或存根或其他任何东西。

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

+0

我正在使用IISExpress,是否需要使用完整的IIS?以及一切都是本地主机,所以我可以尝试在IIS中创建一个网站。 –

+0

没有只是表达iis会做...改变管道,你应该很好 –

+0

实际上,我刚刚证实我确实已经集成了管道属性,匿名被禁用并启用了窗口。 –