内存中的HttpServer如何知道要托管哪个WebAPI项目?

本文关键字:WebAPI 项目 HttpServer 何知道 内存 | 更新日期: 2023-09-27 18:15:58

我想使用一种流行的内存托管策略对WebAPI项目运行测试。

我的测试驻留在一个单独的项目中。

这是我测试的开始

    [TestMethod]
    public void TestMethod1()
    {
        HttpConfiguration config = new HttpConfiguration();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new {id = RouteParameter.Optional});
        HttpServer server = new HttpServer(config);
        HttpMessageInvoker client = new HttpMessageInvoker(server)
    }

使用HttpServer初始化客户端,建立客户端与服务器的直接连接。

除了提供路由配置信息外,HttpServer如何知道要托管哪个WebAPI项目?

如何同时托管多个WebAPI项目?

似乎HttpServer做了一些魔术来定位WebAPI项目?

谢谢

内存中的HttpServer如何知道要托管哪个WebAPI项目?

Web API依赖于一个名为IAssembliesResolver的服务来获取所有程序集并扫描它们以找到实现IHttpController接口的控制器。

现在,有时Web API可能无法找到您的控制器取决于程序集是否已加载到当前应用程序域。在这种情况下,您需要确保已加载程序集。

查看您的示例测试代码,似乎您没有引用Web API项目中的任何类型,在这种情况下,我假设Web API项目的程序集不会被加载。

你似乎在你的测试中再次注册路由。我建议使用您的Web API项目的WebApiConfig.Register(HttpConfiguration)来做所有的注册的东西。这样,您就可以使用与Web API项目相同的设置进行测试。

指出:

  1. 当使用内存服务器运行测试时,您的请求/响应不会经过格式化程序的序列化/反序列化过程,这是危险的,因为您可能在此过程中遇到真正的问题。所以你一定要注意这个。很久以前,我写了一篇关于这个的博客文章。你可以在这里查看

  2. Fiddler工具在查看原始请求/响应以诊断任何问题时非常有用。如果你正在做内存测试,你将失去这种能力。

Web Api应该找到所有继承自ApiController的控制器。只要所有控制器都在相同的解决方案中,它就可以正常工作。我有一个非常类似的设置,使用内存中的httpserver对另一个项目中的控制器运行测试。这使我能够在我的单元测试项目中进行非常快速的"集成"测试。

只要确保你从web api项目调用任何控制器到你的单独项目,以确保web api项目加载在内存中。例子:

[TestMethod]
public void TestMethod1()
{
 //// So that the web api project is loaded in-memory
 {webapi Project name}.Controller.{controllerName} = new {controller name}() ;
    HttpConfiguration config = new HttpConfiguration();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new {id = RouteParameter.Optional});
    HttpServer server = new HttpServer(config);
    HttpMessageInvoker client = new HttpMessageInvoker(server)
}