6

我有一个控制器,它需要调用另一个控制器。我们在客户端上做这项工作。出于性能原因,我们想做这个服务器端。

请求是一个 POST 请求 Url = " http://example.com/api/foo/1234567 (非常标准的 url 与 id 绑定)

请求数据

{
  something1:'abc',
  something2:'def',
  copyFromUrl : '/api/bar/7654321'

};

copyFromUrl 可以是应用程序中的任何其他控制器。我不想在堆栈中上下夹杂一堆 if 语句来进行绑定。

使问题复杂化的是大多数控制器具有三个不同的 GET 签名。获取(字符串 id) 获取(字符串 id,字符串 xpath) 获取()

4

1 回答 1

2

这样做的一种方法是基本上短路 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 名称才能通过内部验证。

如果可能的话,此代码只是一个说明,概念验证。

于 2015-03-19T21:53:56.823 回答