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

Ani*_*mar 5 c# asp.net-web-api asp.net-web-api2

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

Localhost 的一切都很好。但是当我在服务器上托管 Service 时,当我从 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;
Run Code Online (Sandbox Code Playgroud)

控制器

  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;
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

模型

public class User
{
    public int _UserID { get; set; }
    public string _Email { get; set; }
    public string _UserName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

网页配置

Web.Config 文件粘贴在图像中

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;
Run Code Online (Sandbox Code Playgroud)

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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

邮递员请求和响应

以上邮递员请求的标题

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
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*can 20

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


小智 2

这是你的问题的解决方案

ASP.NET WebApi:(405) 不允许方法

最后我将web.config中的cookieless =“AutoDetect”更改为cookieless =“UseCookies”,问题解决了。