Azure移动应用程序 - 尝试POST

时间:2015-07-25 19:45:08

标签: c# azure asp.net-web-api cors azure-mobile-services

我尝试将Azure Mobile Service .NET后端迁移到Azure移动应用程序。

我使用的是一些自定义Web Api控制器,迁移后我尝试POST到控制器方法时出现 405 (Method Not Allowed) / The requested resource does not support http method 'POST'.错误以前工作过。

我花了好几个小时尝试不同的CORS设置,但到目前为止我没有成功。

这就是我目前配置Web Api的方式:

HttpConfiguration config = new HttpConfiguration();

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

var cors = new EnableCorsAttribute("*", "*","*");
//var cors = new EnableCorsAttribute("*", "*","GET,POST,DELETE,HEAD,PUT,PATCH,OPTIONS");
config.EnableCors(cors);

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

config.MapHttpAttributeRoutes();

控制器看起来像这样:

[Authorize]
[RoutePrefixAttribute("rest/companies")]
public class CompaniesController : ApiController
{
    [HttpPost]
    [Route("my-active")]
    //[EnableCors("*","*","*")]
    public HttpResponseMessage SetActive(/*[FromBody]*/Company company)
    {
        // Implementation
    }
}

我也尝试过:

  • 在web.config中设置CORS设置(自定义标头/不同设置),例如。 <add name="Access-Control-Allow-Methods" value="GET,POST,DELETE,HEAD,PUT,PATCH,OPTIONS" />
  • 根据此博客文章添加了一个cors消息处理程序 (http://blog.bittercoder.com/2012/09/09/cors-and-webapi/
  • 此处理程序也已删除:<remove name="OPTIONSVerbHandler" />

我注意到的一件事是,Azure移动应用程序组件似乎覆盖了允许的方法,并允许我使用config.EnableCors(cors)配置的标头。我只能使用web.config和消息处理程序来控制所有设置。但它无论如何都没有解决405问题。

此时,我不确定它是否是一个CORS问题。

有什么想法吗?目前很难找到关于移动应用程序的好文档,如果.NET后端部分是开源的,我将不胜感激......对我而言,它有点像黑盒子。

3 个答案:

答案 0 :(得分:2)

当您激活App Service授权并忘记将您的移动客户端URL从http更改为https时,可能会发生这种情况。 如果是这样,您的http Post将被重定向到https网址,但会显示Get消息。 感谢Fiddler。

答案 1 :(得分:1)

OMG,我发现我的代码存在问题。我不得不交换这两个陈述:

// Needs to be called before MapHttpRoute
config.MapHttpAttributeRoutes();

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

当我使用Azure移动服务时,调用MapHttpAttributeRoutes会导致错误'已经添加了具有相同密钥的项目',因此我删除了该行。为了让属性路由工作,我不得不再次为Azure Mobile Apps重新插入它,但我在错误的地方做了,所以要小心。

答案 2 :(得分:0)

如果http Post被重定向为https网址为Get,请尝试直接呼叫https。

在这种情况下,

Azure日志如下所示:

Received request: POST http://xxx.azurewebsites.net/api/Data/test
Information Redirecting: https://xxx.azurewebsites.net/api/Data/test
Received request: GET https://xxx.azurewebsites.net/api/Data/test

在这种情况下,请致电 https ://xxx.azurewebsites.net/api/Data/test