从另一个 Web api 调用 Web api

Posted

技术标签:

【中文标题】从另一个 Web api 调用 Web api【英文标题】:Calling a Web api from another Web api 【发布时间】:2015-06-17 12:01:12 【问题描述】:

是否有可能制作一个调用另一个 Web api 的 Web api?

我正在使用下面的代码从我的 web api 访问 web api,但它永远不会从调用中返回。如果我使用控制台应用程序中的代码,它可以正常工作。

public void DoStuff()
    RunAsync().Wait();


public static async Task RunAsync()
using (var client = new HttpClient())

    client.BaseAddress = new Uri("http://localhost:53452/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    // HTTP GET
    HttpResponseMessage response = await client.GetAsync("umbraco/api/Member/Get?username=test");
    if (response.IsSuccessStatusCode)
    
        string user = await response.Content.ReadAsAsync<string>();
    


【问题讨论】:

您尝试在 Web API 中调用的 umbraco API 吗? 显示完整的方法声明以及你如何调用它(异步方法)。 是的,我正在调用 Umbraco API 上的函数(我自己的函数)。 您使用的是哪个版本的 Umbraco?你能把详细信息发给我吗? 我同意@YuvalItzchakov。你能提供整个动作方法吗?也只是为了绕过明显的你在 GetAsync() 之前和之后设置了一个断点来验证执行是否到达调用而不是返回(而不是其他一些不相关的问题)。 【参考方案1】:

我也遇到了同样的问题,经过大量研究后,我发现如果HttpClient 返回错误 500,await 运算符不会停止工作。为了解决这个问题,我使用了Task.Wait()

var response = client.GetAsync ("umbraco/api/Member/Get?username=test");
response.Wait ();

我希望这对其他人有所帮助。

【讨论】:

那么如何访问 HttpResponseMessage 呢? 在 'Wait()' 函数之后,只需调用 'Result' 属性即可。 HttpResponseMessage result = response.Result;【参考方案2】:

是的,您可以在 web api 控制器的操作方法中调用远程 web api。

让我们先消除显而易见的问题。

如果您在此操作方法的开头设置断点,它会被命中吗?如果不是,那么问题在于路由而不是操作方法。

如果您在 if 语句处设置断点,它会被命中还是 client.GetAsync() 调用永远不会返回?

如果您还没有这样做,您可能希望使用 fiddler (http://www.telerik.com/fiddler) 之类的工具来比较使用 api 和这个损坏的 api 的请求和响应。我知道你说它与工作实现相同,但我发现提琴手对于准确验证“在线”发送的内容非常宝贵。

【讨论】:

我正在使用 Fiddler,但它从不调用其他 API,因此 Fiddler 仅显示对“第一个”api 的第一次调用。调试时,它永远不会从“await client.GetAsync("umbraco/api/Member/Get?username=test");”返回,没有错误 好吧,就是这样。如果提琴手在网络上什么也没有显示,那不仅仅是没有响应返回,也没有发出请求。您能否提供整个操作方法,因为问题可能在于您提供的代码的“上游”。简短的回答是肯定的,提供的代码应该可以工作。 api控制器的action方法只是一个方法。在其中执行应该与在另一个方法(即您的控制台测试应用程序)中执行没有什么不同。 我在尝试调用 Umbraco API ***.com/questions/24508306/… 时遇到了同样的问题。我不知道你是不是这样。 Umbraco api 在 Fiddler 中运行良好,但看起来有些东西被锁定在我调用 Umbraco API 的 API 中。 当我使用下面示例中的代码时,它工作正常。但我还没有发现为什么另一个例子不起作用:codeproject.com/Tips/497123/…

以上是关于从另一个 Web api 调用 Web api的主要内容,如果未能解决你的问题,请参考以下文章

如何使用标题中的两个参数和正文中的第二个参数从另一个 MVC 项目调用 Web API

从另一个 API 端点动态触发现有 Flux - Spring Webflux

.Net 控制台应用程序调用 Web API,调用另一个 Web API

Azure Active Directory:web api调用另一个web api

无需等待结果即可从Web API调用另一个Web API

如何将一个 web api 控制器方法调用到另一个 web api 项目中? [关闭]