【问题标题】:Azure Mobile App - Getting 405 (Method Not Allowed) when trying POSTAzure 移动应用程序 - 尝试 POST 时出现 405(不允许的方法)
【发布时间】:2015-07-25 19:45:08
【问题描述】:

我正在尝试将我的 Azure 移动服务 .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 后端部分开源,我将不胜感激……这对我来说有点像一个黑匣子。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      天哪,我发现我的代码有问题。我不得不交换这两个语句:

      // 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 移动应用重新插入它才能使属性路由正常工作,但我在错误的地方做了,所以要小心。

      【讨论】:

        【解决方案3】:

        如果http Post以Get方式重定向到https url,请尝试直接调用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

        【讨论】:

          猜你喜欢
          • 2013-04-27
          • 2017-10-27
          • 1970-01-01
          • 2014-05-23
          • 2018-08-22
          • 2016-02-15
          • 2014-04-18
          • 2018-12-20
          • 2015-11-16
          相关资源
          最近更新 更多