C# 如何使用解决方案中其他项目的Web Api项目?

C# 如何使用解决方案中其他项目的Web Api项目?,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我正在开发一个ASP.NET Web Api和一个ASP.NET网站。 该网站将使用Web Api,移动应用程序也将通过REST使用Web Api 分别开发这两个应用程序进展顺利,但是我现在正处于从网站开始测试Web Api的阶段,理想情况下,所有这些都是在visual studio中进行的。例如,我有一个页面,其中有一个表单,完成后将调用我的Web Api将用户添加到数据库中。将这些表单上传到网上进行测试自然是不可能的 那么,这里的最佳实践是什么?您可以简单地从网站项目(Aspx)中引用Web

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

分别开发这两个应用程序进展顺利,但是我现在正处于从网站开始测试Web Api的阶段,理想情况下,所有这些都是在visual studio中进行的。例如,我有一个页面,其中有一个表单,完成后将调用我的Web Api将用户添加到数据库中。将这些表单上传到网上进行测试自然是不可能的


那么,这里的最佳实践是什么?您可以简单地从网站项目(Aspx)中引用Web Api,或者是否有其他方法来实现这一点。

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

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

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

对于自托管服务:

对于:


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


顺便说一下,您应该为您的web api项目启用,这样您就可以从MVC项目访问它了

使用下面的代码来使用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");
    }
公共异步任务索引()
{
使用(var client=new HttpClient())
{
client.BaseAddress=新Uri(“http://localhost:54568/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
HttpResponseMessage response=wait client.GetAsync(“api/Values/”);//api控制器名称
if(响应。IsSuccessStatusCode)
{
var result=await response.Content.ReadAsAsync();
如果(结果!=null)
var输出=结果;
}
}
返回视图(“在此处返回您的模型”);
}

您不需要添加WEB API项目作为参考,需要使用HTTP客户端对象来使用API服务。。。并确保Web API项目正在运行,为此,您需要在Visual Studio中同时运行多个项目。那么您的意思是,如果我从一个Visual Studio实例运行Web API项目,并从另一个实例启动我的网站,我将能够从我的网站对我的Web API进行http调用?Thanks@PersuitOfPerfection您不需要打开多个VisualStudio实例。右键单击解决方案,选择“公共属性”,然后在“启动项目”中指定多个启动项目。如果你的api在端口4000上运行,你的网站就会点击。是的,这就是我的意思,但我认为你不需要运行2个visual studio实例。您可以从一个实例运行它们。对于像VS;)这样的大型程序来说,这太糟糕了我从这个问题中学到了很多!谢谢你的补充信息。非常感谢你的评论。这就是我到目前为止一直在做的事情(使用手动调用我的方法的测试用例)。至于自托管web api,这真的很有趣。谢谢你的链接!这很好,因为您可以将api测试与依赖项目分离。请注意这种方法:“HttpClient只需实例化一次,并在应用程序的整个生命周期内重复使用。以下情况可能会导致SocketException错误:每个请求创建一个新的HttpClient实例。服务器负载较重。”
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);
    }
}
Install-Package Microsoft.AspNet.WebApi.Client
    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");
    }