VulgarBinary
VulgarBinary

Reputation: 3599

Calling another Web API controller directly from inside another Web API controller

Given a controller Proxy and an action of GetInformation. I want to be able to call the method GetInformation of the Users controller. Both the WebAPI controllers are in the same project but direct calls like

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

Doesn't work.

The signature is:

public HttpResponseMessage GetInformation(InformationRequest request)

I do not want to do a full redirect response as I do not want the UserController route exposed externally. This needs to be an internal only call.

Upvotes: 15

Views: 33279

Answers (3)

Sumit Roy
Sumit Roy

Reputation: 423

Another way can be:

IQueryable<Users> GetInformation()

without using the IHttpActionResult return type. Your method will still remain an Http GET method and then call it in the same way as you call any class method.

Upvotes: 1

VulgarBinary
VulgarBinary

Reputation: 3599

For those wanting to solve this API to API method in different controllers, we have found a solution that works. The initial attempt was close, just missing a few things.

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);

In doing this it allows construction of the target controller and direct invocation of the method desired. The biggest complexity here is the Uri adjustment.

Upvotes: 8

Mauricio Gracia Gutierrez
Mauricio Gracia Gutierrez

Reputation: 10862

You should do something like this in your UsersController

public HttpResponseMessage GetInformation(InformationRequest request)
{
    HttpResponseMessage resp ;

    resp = UserBusinessLogic.GetInformation(request) ;

    return resp ;
}

and from your ProxyController you can resuse that "UserBusinessLogic" method to obtain the same information using the same code snippet.

Upvotes: 3

Related Questions