直接从另一个Web API控制器内部调用另一个Web API控制器

时间:2016-10-19 19:27:00

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

给定控制器ProxyGetInformation的操作。我希望能够调用GetInformation控制器的方法Users。两个WebAPI控制器都在同一个项目中,但直接调用如

var controller = new UsersController();
return controller.GetInformation(request);

不起作用。

签名是:

public HttpResponseMessage GetInformation(InformationRequest request)

我不想做完整的重定向响应,因为我不想让UserController路由暴露在外部。这需要是一个内部唯一的电话。

3 个答案:

答案 0 :(得分:5)

对于那些想要在不同控制器中将API解析为API方法的人,我们找到了一个有效的解决方案。最初的尝试很接近,只是遗漏了一些东西。

var controller = new UserAccountController
{
   Request = new HttpRequestMessage(HttpMethod.Post, Request.RequestUri.AbsoluteUri.Replace("/current/route", "/route/to_call"))
};
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = new HttpConfiguration();
return controller.GetInformation(request);

在这样做时,它允许构建目标控制器并直接调用所需的方法。这里最大的复杂性是Uri调整。

答案 1 :(得分:1)

您应该在UsersController中执行类似的操作

CREATE TABLE dbo.MedicineDoseConversion (
  medicine_name varchar(20) not null,
  dose_to_convert_min_units int null,
  dose_to_convert_max_units int null,
  dosage_multiplier decimal(18,10) not null
)
GO

INSERT dbo.MedicineDoseConversion (medicine_name, dose_to_convert_min_units, 
dose_to_convert_max_units, dosage_multiplier)
SELECT 'Codeine', null, null, 0.15 UNION ALL
SELECT 'Fentanyl', null, null, 2.4 UNION ALL
SELECT 'Hydrocodone', null, null, 1 UNION ALL
SELECT 'Hydromorphone', null, null, 4 UNION ALL
SELECT 'Methadone', 1, 20, 4 UNION ALL
SELECT 'Methadone', 21, 40, 8 UNION ALL
SELECT 'Methadone', 41, 60, 10 UNION ALL
SELECT 'Methadone', 60, null, 12 UNION ALL
SELECT 'Morphine', null, null, 1 UNION ALL
SELECT 'Oxycodone', null, null, 1.5 UNION ALL
SELECT 'Oxymorphone', null, null, 3
;
GO

从您的ProxyController中,您可以重新使用" UserBusinessLogic"使用相同代码段获取相同信息的方法。

答案 2 :(得分:0)

另一种方式可以是:

IQueryable<Users> GetInformation()

不使用IHttpActionResult返回类型。你的方法仍然是一个Http GET方法,然后调用它就像你调用任何类方法一样。