WebApi Post 方法总是返回“请求的资源不支持 http 方法 'GET'。”状态:405 方法不允许

Posted

技术标签:

【中文标题】WebApi Post 方法总是返回“请求的资源不支持 http 方法 \'GET\'。”状态:405 方法不允许【英文标题】:WebApi Post Methods always Returns "The requested resource does not support http method 'GET'." Status: 405 Method Not AllowedWebApi Post 方法总是返回“请求的资源不支持 http 方法 'GET'。”状态:405 方法不允许 【发布时间】:2017-03-31 03:13:45 【问题描述】:

我创建了一个简单的 Web api 服务来获取和发布用户数据

Localhost 一切正常。但是当我在服务器上托管服务时,当我从 PostMan/Browser 调用它时,Get Method 工作正常。但是 Post Methods 总是返回 “请求的资源不支持 http 方法 'GET'。”状态:405 方法不允许

我在这里感到困惑的一件事,即我请求了一个 POST 呼叫,但状态消息显示“GET”错误。为什么应该这样?如果是CORS问题?我通过在应用程序级别(Web.Config 以及 Nuget 包管理器 Cors)在 Internet 上搜索答案,尝试在各种场景/方面启用 CORS。仍然得到 405 Method Not Allowed。下面粘贴了我的 API 代码:

控制器命名空间:

  using mysql.Data.MySqlClient;
  using System;
  using System.Collections.Generic;
  using System.Data;
  using System.Linq;
  using System.Net;
  using System.Net.Http;
  using System.Web.Http;
  using System.Web.Http.Cors;

控制器

  public class UsersController : ApiController
  
    [Route("api/Users/GetUsers/UserId")]
    [HttpGet]
    public IEnumerable<User> GetUsers(int UserId)
    
        try
        
            List<User> userlist = new List<User>();
            MySqlCommand cmd = new MySqlCommand("GetUsers");
            cmd.Parameters.AddWithValue("aUserId", UserId);
            cmd.CommandType = CommandType.StoredProcedure;
            DataTable dt = obj.GetData(out ErrorMsg, cmd);
            // Did Some Stuff and Returns Model;
            return userlist;
        
        catch(Exception ex)
        
            // Written Error Log & Returns Empty Model;
        
    

    [Route("api/Users/SaveUser")]
    [HttpPost]
    public IEnumerable<User> SaveUser([FromBody]dynamic request)
    
        try
        
            string UserName = request.Param_Name;
            string Email = request.Param_Email;
            List<User> userlist = new List<User>();
            MySqlCommand cmd = new MySqlCommand("UserSave");
            cmd.Parameters.AddWithValue("aUserName", UserName);
            cmd.Parameters.AddWithValue("aEmail", Email);
            cmd.CommandType = CommandType.StoredProcedure;
            DataTable dt = obj.GetData(out ErrorMsg, cmd);
            UserAuthenticate userdata;
            // Did Some Stuff and returns UserModel;
            return userlist;
        
        catch(Exception Ex)
        
            // Written Error Log & Returns Empty Model with Error Message;
        
    

    [Route("api/Users/SaveUserModel")]
    [HttpPost]
    public IEnumerable<User> SaveUserModel([FromBody]User request)
    
        try
        
            string Param_UserName = request._UserName;
            string Param_Email = request._Email;
            List<User> userlist = new List<User>();
            MySqlCommand cmd = new MySqlCommand("UserSave");
            cmd.Parameters.AddWithValue("aUserName", Param_UserName);
            cmd.Parameters.AddWithValue("aEmail", Param_Email );
            cmd.CommandType = CommandType.StoredProcedure;
            DataTable dt = obj.GetData(out ErrorMsg, cmd);
            UserAuthenticate userdata;
            // Did Some Stuff and returns UserModel;
            return userlist;
        
        catch(Exception Ex)
        
            // Written Error Log & Returns Empty Model with Error Message;
        
    
 

型号

public class User

    public int _UserID  get; set; 
    public string _Email  get; set; 
    public string _UserName  get; set; 

Web.Config

Web.Config File Pasted here in Image

WebApi.Config

命名空间

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Web.Http;
using System.Web.Http.Cors;

WebApiConfig 类

public static class WebApiConfig

    public static void Register(HttpConfiguration config)
    
        // Web API configuration and services
        var cors = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(cors);
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/controller/id",
            defaults: new  id = RouteParameter.Optional 
        );
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    

PostMan Request & Response

以上邮递员请求的标头

Access-Control-Allow-Methods →*
Access-Control-Allow-Origin →*
Access-Control-Request-Headers →: *
Access-Control-Request-Method →: *
Allow →POST
Cache-Control →no-cache
Content-Length →72
Content-Type →application/json; charset=utf-8
Date →Wed, 16 Nov 2016 17:50:03 GMT
Expires →-1
Pragma →no-cache
Server →Microsoft-IIS/7.5
X-AspNet-Version →4.0.30319

感谢您的帮助!!为这个错误浪费了一天时间。

【问题讨论】:

你是如何调用这个 API 的?什么方法? 通过邮递员我打电话。方法是 SaveUser 和 SaveUserModel。附加邮递员请求和响应图像。以及粘贴标题 你确定吗?您正在选择 POST 吗? @viveknuna 是的!我确定 你在打什么网址? 【参考方案1】:

我知道这是一篇旧帖子,但是对于正在寻找解决此问题的其他人来说。我遇到了这个问题,并意识到我正在使用 http 发布到我的 webapi,但 IIS 正在将我的请求重定向到 https。此重定向导致邮递员将 POST 更改为 GET。将我的 URL 更改为 https 解决了我的问题。

【讨论】:

感谢您指出 http 与 https。我有同样的问题 救命稻草!非常感谢。我花了太多时间试图弄清楚这一点。【参考方案2】:

这里是你的问题的解决方案

ASP.NET WebApi : (405) Method Not Allowed

最后我把web.config中的cookieless="AutoDetect"改成了cookieless="UseCookies",问题就解决了。

【讨论】:

如果可以的话,我会给你500分。它拯救了我一整天。谢谢。【参考方案3】:

如果您还没有启用 CORS,请如下装饰您的控制器。

  [EnableCors(origins: "*", headers: "*", methods: "GET, POST, PUT, DELETE")] 

同时将 belo 代码放入 webapiconfig.cs 文件中

  config.EnableCors();

如果您将端点托管在公共 api 中,那么 如下装饰控制器。

 [RoutePrefix("api/users")]
    public class usersController : ApiController

然后获取例如,

   //Get http:192.168.0.0:2210/api/users/
      [Route("~/api/users")]

     //POST  http:192.168.0.0:2210/api/users/
     [Route("~/api/users")] 

    //Get on id
     //POST  http:192.168.0.0:2210/api/users/
     [Route("~/api/users/id")] 

【讨论】:

以上是关于WebApi Post 方法总是返回“请求的资源不支持 http 方法 'GET'。”状态:405 方法不允许的主要内容,如果未能解决你的问题,请参考以下文章

请求的资源不支持 http 方法 'GET' 但使用 'POST'

HTTP POST 方法在 WebApi 上被视为 GET

ASP.NET Web API - 请求的资源不支持 http 方法“GET”

跨域 WebAPI 批量请求

调用 WebAPI 时,请求的资源上不存在 Access-Control-Allow-Origin 标头

Task.Wait 总是返回 false 虽然任务完成