【问题标题】:Web Api 2 Attribute Routes not loading in MSTest projectWeb Api 2 属性路由未在 MSTest 项目中加载
【发布时间】:2014-07-24 19:34:58
【问题描述】:

我正在尝试为使用属性路由的 Web Api 2 路由创建集成测试。我在解决方案中有 2 个项目,一个 Web Api 2 项目(本示例为自托管),其中包含一个包含以下路由的控制器和一个用于运行测试的 MSTest 项目。

控制器:

public class ProductsController : ApiController
{
    Product[] products = new Product[]  
    {  
        new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },  
        new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },  
        new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }  
    };

    [Route("products")]
    [HttpGet]
    public IEnumerable<Product> GetAllProducts()
    {
        return products;
    }
}

主要:

    static void Main(string[] args)
    {
        var config = new HttpSelfHostConfiguration("http://localhost:8080");

        config.MapHttpAttributeRoutes();

        using (HttpSelfHostServer server = new HttpSelfHostServer(config))
        {
            server.OpenAsync().Wait();
            Console.WriteLine("Press Enter to quit.");
            Console.ReadLine();
        }
    }

当我在调试 Web Api 项目时从浏览器/提琴手点击它时,上面的路由运行得很好。我已经尝试过自托管和 IIS,并且在这种情况下都可以工作。

在我的 MSTest 项目中,我像这样配置自托管服务器:

    [TestMethod]
    public void TestMethod1()
    {
        var config = new HttpSelfHostConfiguration("http://localhost:8080");

        config.MapHttpAttributeRoutes();
        config.EnsureInitialized();

        using (HttpSelfHostServer server = new HttpSelfHostServer(config))
        {
            server.OpenAsync().Wait();

            var client = new HttpClient();
            var response = client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "http://localhost:8080/products")).Result;
            var code = response.StatusCode;

            server.CloseAsync().Wait();
        }
    }

总是找不到路线。此外 config.Routes 不包含我的路线。我尝试实现一个自定义 IAssemblyResolver 以尝试让 MapHttpAttributeRoutes() 在包含控制器的程序集中找到启用属性的路由,但没有运气。

任何帮助将不胜感激!

*简化测试示例

【问题讨论】:

  • 你的 global.cs 是什么样的?
  • 包含 Global.asax.cs 代码。这是你的意思吗?我的理解是 Application_Start() 永远不会在 MSTest 项目的上下文中触发。
  • 好的,谢谢。现在提供 WebApiConfig.Register 的样子。
  • 你能提供你试图调用的控制器吗?类的声明和你想要调用的函数。
  • 好的,我包含了 WebApiConfig.Register

标签: mstest asp.net-web-api2 asp.net-web-api-routing


【解决方案1】:

自托管解决方案:

此处的问题已通过自定义 IAssemblyResolver 解决。见:https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/CustomAssemblyResolverSample

虚拟主机解决方案:

这个有点棘手。在 WebApiConfig.Register() 中对 config.MapHttpAttributeRoutes() 的调用必须是针对配置执行的第一件事。在我们定义我们的标准模板路由之前,我已经有了这个调用,但是上面有两个调用。 config.EnableCors() 和 config.AddODataQueryFilter()。一旦我将对 MapHttpAttributeRoutes() 的调用移到这两个之上,一切就开始工作了。无需自定义 IAssemblyResolver。

感谢 wbennet 的帮助!

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 2021-08-27
    • 2014-05-28
    • 2017-08-16
    • 2014-04-19
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多