这样做的一种方法是基本上短路 HttpServer 和 HttpClient 类。我在这里使用 ASP.NET Web API 2,但希望相同的技术可以与原始 Web API 一起使用。
这是简约的工作示例:
public class BarController : ApiController
{
// GET http://localhost/api/bar
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] {"Foo Bar", "Progress Bar"};
}
// GET http://localhost/api/bar?bar=Towel Bar
[HttpGet]
public IEnumerable<string> GetCustomBar(string bar)
{
return new string[] {"Foo Bar", "Progress Bar", bar};
}
// POST http://localhost/api/bar?action=/api/bar?bar=Towel Bar
[HttpPost]
public HttpResponseMessage StartAction(string action)
{
var config = new HttpConfiguration();
WebApiConfig.Register(config);
var server = new HttpServer(config);
var client = new HttpClient(server);
var response = client.GetAsync("http://localhost/" + action).Result;
return response;
}
正如您在此处看到的,前两个动作的参数不同,第三个动作接受允许它调用任何其他动作的 url(如代码示例中所示)。
我们基本上是在内存中托管一个服务器,应用与我们真实服务器相同的路由,然后立即查询它。
硬编码localhost
实际上并没有在运行时使用,路由会忽略它,但我们需要有效的绝对 URL 名称才能通过内部验证。
如果可能的话,此代码只是一个说明,概念验证。