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

4
尝试使用Table Controller和Custom Controller,但无法定义两个接受相同参数和相同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个回答

5

我花了数小时尝试在Azure应用服务中实现多个POST方法(请注意,应用服务替代了移动服务,请参考:将现有的.NET Azure移动服务升级到应用服务)。

一般解决方案可以在上述Web API控制器中使用多个HttpPost方法中找到。但是,在应用服务的情况下,有一个非常重要的注释。 在官方微软示例中(参考:使用Azure移动应用程序的.NET后端服务器SDK),默认配置被建议为:

HttpConfiguration config = new HttpConfiguration();

new MobileAppConfiguration()
    .UseDefaultConfiguration()
    .ApplyTo(config);

不幸的是,UseDefaultConfiguration()方法调用MapApiControllers(),使用标准路由“api/{controller}/{id}”,但对{id}没有任何限制。这种路由与“api/{controller}/{action}”不兼容。因此,如果有人想要使用多个POST方法,则应该将标准配置替换为:

HttpConfiguration config = new HttpConfiguration();

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

当然也可以使用“api/{controller}/{action}/{id}”路由,同样支持可选的{id}参数。
我希望我的研究能够为某些人节省许多时间和精力。如果微软的某个人看到了这篇文章,请在默认示例中进行轻微的评论或者更好地,在UseDefaultConfiguration中添加一个参数来决定是否使用“api/{controller}/{action}”路由。

1
谢谢!我已经尝试了3-4个小时并进行了大量的搜索,才终于让它工作。您的帖子解决了我的问题。不过需要注意一点:MobileAppTableconfiguration应该是MapTableControllers而不是MapApiControllers。 - Stefan Wexel
是的 Stefan,你说得对。我已经在我的帖子中纠正了代码。谢谢。 - Dariusz Wasacz
不要忘记使用:config.MapHttpAttributeRoutes(); 否则这些属性将被忽略... - Inna

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,请搜索“属性路由”。

请注意,您需要使用Mobile Services APIController而不是TableController,因为TableController会为您设置一些路由。 - lindydonna
请问在移动客户端中调用这些自定义路由的特殊方法吗? - Damien Doumer

1
根据RESTful原则,您只能使用一个特定签名的动词方法。但是,您可以随时修改路由并实现它,但这样做将不符合RESTful原则。在某些情况下,如果情况需要,这样做也可以接受。 请参阅此文章Web API控制器中的多个HttpPost方法

你能否提供一些权威文件的链接,以证实REST不允许在控制器上进行多个GET请求?问题在于OP只使用了一个HTTP GET(路由),这是模棱两可的,因此Web API处于错误状态。 - Sentinel
请参考以下内容:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html https://github.com/flask-restful/flask-restful/issues/114 http://salesforce.stackexchange.com/questions/5693/can-we-create-multiple-http-methods-rest-annotations-of-the-same-type-in-a-si - Aravind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接