如何在不托管的情况下启动ASP.Net应用程序?

时间:2016-10-19 10:46:46

标签: c# asp.net automated-tests owin web-testing

我正在为我的ASP.Net Web应用程序编写集成测试,所以我想启动它并测试HTTP请求/响应级别。

因为测试应该以并发的最小权限同时运行,所以我不想在任何真正的HTTP端口上公开它们。

我读到OWIN声称是ASP.Net应用程序和Web服务器之间的接口。

我有一个想法是使用一些模拟Web服务器对象,它使用OWIN来托管ASP.Net应用程序,并且不会在任何HTTP端口公开它。 而不是这样,Web服务器对象应该通过调用其方法接受HTTP请求,将它们提供给它所托管的应用程序,并将响应转发给调用者。

现有解决方案吗?

2 个答案:

答案 0 :(得分:1)

感谢dawidr我发现使用ASP.Net MVC / Web API的人有类似的方法 - Microsoft.Owin.Testing

using (var server = TestServer.Create<Startup>())
    server.HttpClient.GetAsync("api/ControllerName")
        .Result.EnsureSuccessStatusCode();

通过这种方式,可以使用(并测试)Owin的Startup对象,用于真正的托管场景。

答案 1 :(得分:1)

如果您使用的是.NET Core,那么我会在这里找到有用的信息:https://docs.asp.net/en/latest/testing/integration-testing.html

以下是如何配置测试服务器的示例:

public static void Main(string[] args)
{
     var contentRoot = Directory.GetCurrentDirectory();

     var config = new ConfigurationBuilder()
        .SetBasePath(contentRoot)
        .AddJsonFile("hosting.json", optional: true)
        .Build();

    //WebHostBuilder is required to build the server. We are configurion all of the properties on it
    var hostBuilder = new WebHostBuilder()

    //Server
    .UseKestrel()

    //URL's
    .UseUrls("http://localhost:6000")

    //Content root - in this example it will be our current directory
    .UseContentRoot(contentRoot)

    //Web root - by the default it's wwwroot but here is the place where you can change it
    //.UseWebRoot("wwwroot")

    //Startup
    .UseStartup<Startup>()

    //Environment
    .UseEnvironment("Development")

    //Configuration - here we are reading host settings form configuration, we can put some of the server
    //setting into hosting.json file and read them from there
    .UseConfiguration(config);

   //Build the host
   var host = hostBuilder.Build();

   //Let's start listening for requests
   host.Run();
}

如您所见,您可以重用现有的Startup.cs类。