Silagy
Silagy

Reputation: 3083

Defining two get function in WebAPI

I am getting to following exception when i am trying to call a GET function in MVC WebAPI

 {"$id":"1","Message":"An error has occurred.",
 "ExceptionMessage":"Multiple actions were found that match the request: 
 \r\nSystem.Xml.XmlNode Get(Int32, System.String) 

I think the problem is cause due to two get function I have defined two functions:

One:

   [HttpGet]
   public XmlNode Get(int id, string Tokken)
   {
        //Do something
   }

Second One

 [HttpGet]
 public List<UsersAnswers> GetUsersInteractions(int? activityID, string Tokken)
 {
  // Do Something
 }

The route configuration

  config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

Now i am getting the exception when i try to call to the second function:

{SiteURL}/api/Activities/GetUsersInteractions?activityID=32&Tokken=r54e54353

As you can see the route engine sent the request to the first function instead of the second.

How can i define two get operation and to call each one separately?

Upvotes: 0

Views: 4555

Answers (2)

Erwin
Erwin

Reputation: 3090

With the default routing template, Web API uses the HTTP method to select the action. However, you can also create a route where the action name is included in the URI:

routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

In this route template, the {action} parameter names the action method on the controller. With this style of routing, use attributes to specify the allowed HTTP methods. For example, suppose your controller has the following method:

public class ProductsController : ApiController
{
    [HttpGet]
    public string Details(int id);
}

In this case, a GET request for “api/products/details/1” would map to the Details method. This style of routing is similar to ASP.NET MVC, and may be appropriate for an RPC-style API.

You can override the action name by using the ActionName attribute. In the following example, there are two actions that map to "api/products/thumbnail/id. One supports GET and the other supports POST:

public class ProductsController : ApiController
{
    [HttpGet]
    [ActionName("Thumbnail")]
    public HttpResponseMessage GetThumbnailImage(int id);

    [HttpPost]
    [ActionName("Thumbnail")]
    public void AddThumbnailImage(int id);
}

Upvotes: 4

Thorsten Dittmar
Thorsten Dittmar

Reputation: 56697

You are not calling the second function - the second function is named InsertUserRecord and is a POST method. The function you're calling via GET is GetUserInteractions. As there's no such function for GET, the engine may map this to the only GET function there is, but actually it should throw a "no such function" error.

Upvotes: 1

Related Questions