使用.NET作为后端时,如何在Azure移动服务中定义自定义api路由?

时间:2015-07-19 17:57:40

标签: asp.net azure azure-mobile-services

尝试了表控制器和自定义控制器,但无法使用相同的http方法定义接受相同参数的两个函数。例如,当声明

public Person GetMemberDetails(int id)
{
   // Some Code
   return person;
}

public Person GetMemberAddress(int id)
{
   // Some Code
   return person;
}

因为两个函数都在使用GET请求,并且在构建项目后两者都有相同的输入,所以我无法使用它们中的任何一个。当我删除一个或修改一个使用任何其他请求方法,我能够请求。

http://<azure-mobile-service-name>/Person/{id}

有没有办法用相同的签名和相同的请求方法声明两个函数?

3 个答案:

答案 0 :(得分:4)

您需要使用Route属性,例如:

 [Route("api/getdetails")]
public Person GetMemberDetails(int id)
{
   // Some Code
   return person;
}
[Route("api/getaddress")]
public Person GetMemberAddress(int id)
{
   // Some Code
   return person;
}

如果您想要路线中的ID

,请搜索“属性路由”

答案 1 :(得分:4)

我花了好几个小时尝试在Azure App Service中获取多个帖子方法(请注意,App Services取代了移动服务,参考号:Upgrade your existing .NET Azure Mobile Service to App Service)。

一般解决方案可以在前面提到的Multiple HttpPost method in Web API controller中找到。但是,对于App Services,还有一个非常重要的评论。 在官方Microsoft示例(参考:Work with the .NET backend server SDK for Azure Mobile Apps)中,默认配置建议为:

HttpConfiguration config = new HttpConfiguration();

new MobileAppConfiguration()
    .AddTables(new MobileAppTableConfiguration().MapTableControllers().AddEntityFramework()).AddMobileAppHomeController().AddPushNotifications()
    .ApplyTo(config);
config.Routes.MapHttpRoute("ActionApi", "api/{controller}/{action}");

不幸的是,UseDefaultConfiguration()方法调用MapApiControllers(),它定义了标准路由&#34; api / {controller} / {id}&#34;没有约束{id}。此类路由与&#34; api / {controller} / {action}&#34;不兼容。因此,如果有人想要使用多个post方法,则应将标准配置替换为:

(function(document) {
    //do stuff with document
})(document);

当然可以使用&#34; api / {controller} / {action} / {id}&#34;相反,也可以选择{id}。

我希望我的调查可以为某人节省数小时的神经。如果微软的某人阅读了这篇文章 - 请在默认样本中稍作评论,或者更好的是,在UseDefaultConfiguration中添加一个参数来决定是否使用&#34; api / {controller} / {action}&#34;路由。

答案 2 :(得分:1)

根据RESTful原则,对于具有一个特定签名的动词,您只能使用一种方法。但是你总是可以修改你的路由并实现它,但你不会坚持使用REST。在某些情况下,如果情况要求可以这样做。 请参阅此帖Multiple HttpPost method in Web API controller