【问题标题】:Have a WebAPI Controller send an http request to another controller within the same service让 WebAPI 控制器向同一服务中的另一个控制器发送 http 请求
【发布时间】:2016-11-08 00:58:17
【问题描述】:

我有一个 WebAPI 服务,我希望它向自己发送一个 http 请求。我想确认最合适的方法是什么。 (通常情况下,我只会实例化目标控制器的另一个实例或重构接口后面的代码,然后以这种方式发出请求,但由于各种原因,我不想使用该方法。)

下面的代码是向同一服务中的不同控制器发出 http 请求的最合适方式吗?

using (HttpClient client = new HttpClient())
{
  var httpRequest = new HttpRequestMessage("GET", "https://localhost/SomeOtherController");
  return await client.SendAsync(httpRequest);
}

【问题讨论】:

  • 这似乎相当有效,因为它是一个普通的 HTTP,它是否是 localhost 并不重要。但我真的建议您不要这样做,而是重用共享服务中的通用逻辑,如下所述。

标签: c# .net asp.net-web-api asp.net-web-api2


【解决方案1】:

如果您需要调用另一个控制器,这意味着那里有一些共享代码。 最好的方法是将这段代码抽象到另一个类中,并在两个控制器中使用。

例如:

public class SomeService
{
 public void DoSomeLogic()
 { 
 }
}

public class FirstController : ApiController
{
 public IHttpActionResult SomeAction()
 {
   new SomeService().DoSomeLogic();
 }
}

public class SecondController : ApiController
{
 public IHttpActionResult SomeOtherAction()
 {
   new SomeService().DoSomeLogic();
 }
}

【讨论】:

  • 我宁愿添加一个 ISomeService 并依赖它,并将其注入到控制器的构造函数中,除了共享逻辑。
  • 没错,我只是简短
  • 正如 OP 中大致提到的,我知道通过接口或静态方法等重构代码的方法......但这不是我想在这里使用的方法。
【解决方案2】:

是的,这将是一种合适的称呼方式。

如果您需要执行实际的 HTTP 请求,那么该请求发送到同一服务中的控制器并不重要 - 它只是一个通用的 HTTP 请求。

附带说明 - 您可能想要对那个 URI 字符串做一些事情,这样它就不会全部硬编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 2016-11-22
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2015-12-17
    相关资源
    最近更新 更多