【问题标题】:How can I use my Web Api project from other projects inside my solution?如何从我的解决方案中的其他项目使用我的 Web Api 项目?
【发布时间】:2016-02-18 20:42:04
【问题描述】:

我正在开发一个 ASP.NET Web Api 和一个 ASP.NET 网站。 该网站将使用 Web Api,而移动应用也将通过 REST 使用 Web Api。

分别开发这两个很好,但是我现在正处于我想从网站开始测试 Web Api 的阶段,最好是在 Visual Studio 中。例如,我有一个页面,其中有一个表单,完成后会调用我的 Web Api 将用户添加到数据库。上传这些在线进行测试自然是不可能的。

那么这里的最佳做法是什么?您可以简单地从网站项目 (Aspx) 中引用 Web Api,还是有其他方法可以解决这个问题。

【问题讨论】:

  • 您不需要添加WEB API项目作为参考,需要使用HTTP Client对象来消费API服务......并确保Web API项目正在运行,为此您需要在 Visual Studio 中同时运行多个项目。

标签: c# asp.net asp.net-web-api


【解决方案1】:

对 Web API 控制器和操作的访问基于 url。因此,既然它们位于不同的项目中,您需要同时运行两个项目,以使您的 API 可用于 MVC 项目。

顺便说一句,您应该为您的 web api 项目启用 CORS,以便您可以从您的 MVC 项目 访问它。

【讨论】:

  • 所以你的意思是,如果我从一个 Visual Studio 实例运行我的 Web Api 项目,并从另一个实例启动我的网站,我将能够从我的网站对我的 Web Api 进行 http 调用?谢谢
  • @PersuitOfPerfect 您不需要打开多个 Visual Studio 实例。右键单击您的解决方案,选择通用属性,然后在启动项目中您可以指定多个启动项目。如果您的 api 在端口 4000 上运行,那么您的网站将点击 localhost:4000
  • 是的,这就是我的意思,但我认为您不需要运行 2 个 Visual Studio 实例。您可以从一个实例运行它们。
  • 对于像 VS 这样的庞大程序来说是个新手太糟糕了;)我从这个问题中学到了很多东西!感谢您提供更多信息。真的很感激
【解决方案2】:

使用下面的代码来消费web api项目

    public async Task <ActionResult> Index()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:54568/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpResponseMessage response = await client.GetAsync("api/Values/"); //API controller name
            if (response.IsSuccessStatusCode)
            {
                var result = await response.Content.ReadAsAsync<YourReturnDataType>();
                if (result != null)
                    var output = result;
            }
        }

        return View("Return your model here");
    }

【讨论】:

  • 小心使用这种方法:“HttpClient 旨在被实例化一次并在应用程序的整个生命周期中重复使用。以下情况可能导致 SocketException 错误:为每个请求创建一个新的 HttpClient 实例。服务器位于重物。” docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…
【解决方案3】:

这取决于您要测试的内容。如果您想简单地测试您的控制器实现,您可以创建一个测试项目并引用该项目,手动实例化您的控制器,然后在您的测试中调用它们。

如果您想通过网络进行集成测试,您可以自托管 web api 服务。然后在测试项目中安装web api客户端包Install-Package Microsoft.AspNet.WebApi.Client,通过客户端调用。

示例链接和手动实例化(来自链接):

[TestClass]
public class TestSimpleProductController
{
    [TestMethod]
    public void GetAllProducts_ShouldReturnAllProducts()
    {
        var testProducts = GetTestProducts();
        var controller = new SimpleProductController(testProducts);

        var result = controller.GetAllProducts() as List<Product>;
        Assert.AreEqual(testProducts.Count, result.Count);
    }

使用 web api 客户端的示例(来自链接):

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://localhost:9000/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new                 MediaTypeWithQualityHeaderValue("application/json"));

    // New code:
    HttpResponseMessage response = await client.GetAsync("api/products/1");
    if (response.IsSuccessStatusCode)
    {
        Product product = await response.Content.ReadAsAsync>Product>();
        Console.WriteLine("{0}\t${1}\t{2}", product.Name, product.Price, product.Category);
    }
}

对于自托管服务:

http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api

对于Web Api client

Install-Package Microsoft.AspNet.WebApi.Client

【讨论】:

  • 感谢您的评论。这就是我到目前为止一直在做的事情(使用测试用例手动调用我的方法)。至于自托管 web api,那真的很有趣。感谢您的链接!
  • 这很好,因为您可以将您的 api 测试与依赖项目解耦。
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
相关资源
最近更新 更多