控制器调用另一个控制器 C# WebApi

6

我有一个控制器,需要调用另一个控制器。我们曾经在客户端上完成这项工作。由于性能原因,我们希望在服务器端执行此操作。

请求为POST请求 请求URL = "http://example.com/api/foo/1234567"(具有绑定ID的标准URL)

请求数据:

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

};

copyFromUrl可以是应用程序中的任何其他控制器。我不想在整个堆栈中手动编写大量if语句来进行绑定。

问题的复杂性在于大多数控制器都有三种不同的GET签名。 Get(sting id) Get(sting id, string xpath) Get()


1
在同一个应用程序中,您不需要调用整个http堆栈。您可以像调用任何其他类一样调用您的控制器。MyController controller = new Mycontroller(); MyReturnType ret = controller.Get(id); - T.S.
1
在我的应用程序中,这将需要数百个if语句。如果url包含“/api/foo”,那么(如果查询段=2...等等),路由引擎已经具备了所有这些逻辑。 - Eric Rohlfs
也许你的应用程序设计得不够好?或者它并不是为此而设计的。你真的应该能够以常规的 .net 方式调用任何控制器。我感觉你的应用程序没有很好地遵循“单一职责”原则。 - T.S.
我也遇到了同样的问题。@EricRohlfs,你找到了好的解决方案吗? - aliensurfer
1
@T.S. 我认为你所指的单一职责是指重新调用路由引擎以解析到适当的控制器构造函数和方法的能力。这更多是关于效率而不是糟糕的设计。许多框架支持同时发出多个命令的能力。为什么要发出两个http调用,当一个就可以完成工作呢?在WebApi中如何实现并不直接。 - Eric Rohlfs
显示剩余5条评论
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名称才能通过内部验证。

此代码仅为演示和概念证明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接