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

C# 内存中的HttpServer如何知道托管哪个WebAPI项目?,c#,asp.net,integration-testing,asp.net-web-api,C#,Asp.net,Integration Testing,Asp.net Web Api,我想使用流行的内存托管策略对WebAPI项目运行测试 我的测试驻留在一个单独的项目中 这是我考试的开始 [TestMethod] public void TestMethod1() { HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttpRoute( name: "DefaultApi", rout

我想使用流行的内存托管策略对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项目方面发挥了一些作用


谢谢

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

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

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

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

此外,您似乎正在测试中再次注册路由。我建议使用WebAPI项目的
WebApiConfig.Register(HttpConfiguration)
来完成所有注册工作。这样,您将使用Web API项目具有的相同设置进行测试

注:

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

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


  • 只需确保您正在将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)
    }
    

    HttpServer如何知道要承载的WebAPI服务?我们刚刚提供了路线信息,仅根据我的示例。反射但是,这个例程有什么内容呢?我也在尝试实现它,但是当我从客户端调用服务器时,我只得到一个500错误,没有抛出异常或任何其他类型的诊断信息。有没有办法调试这个?