$http.post 的 Web API 405 错误

Posted

技术标签:

【中文标题】$http.post 的 Web API 405 错误【英文标题】:Web API 405 Error with $http.post 【发布时间】:2015-04-07 02:22:48 【问题描述】:

我在使用 $http.post 的 POST 请求中收到 405 错误。奇怪的是我在我的应用程序的另一个区域使用 $http.post 并且它工作得很好。

我在客户端使用 AngularJS,在服务器端使用 Web API。我已经发布了我能想到的所有相关信息(除了我的 web.config)。我在这里遗漏了什么非常明显的东西吗?


下面的代码不起作用(抛出 405)

这是我尝试使用的 api 控制器方法:

    public async Task<IHttpActionResult> LinkLogin(string provider)
    
        Account user = await _repo.FindByNameAsync(User.Identity.Name);

        if (user == null)
        
            return BadRequest("User does not exist!");
        

        return new ChallengeResult(provider, null, "auth/Manage/LinkLoginCallback", user.Id);
    

这是我试图在客户端点击它的方式:

var _linkLogin = function (provider) 
    $http.post(serviceBase + 'auth/Manage/LinkLogin', provider).then(function (response) 
        return response;
    );
;

下面的代码是有效的代码

有效的 API 控制器功能:

    // POST auth/Authorization/Register
    [AllowAnonymous]
    [Route("Register")]
    public async Task<IHttpActionResult> Register(UserModel userModel)
    
         if (!ModelState.IsValid)
        
            return BadRequest(ModelState);
        

         IdentityResult result = await _repo.RegisterUser(userModel);

         IHttpActionResult errorResult = GetErrorResult(result);

         if (errorResult != null)
         
             return errorResult;
         

         return Ok();
    

从客户端调用它:

var _saveRegistration = function (registration) 

    _logOut();

    return $http.post(serviceBase + 'auth/Authorization/register', registration).then(function (response) 
        return response;
    );

;

这是我的 web api 配置:

public static class WebApiConfig

    public static void Register(HttpConfiguration config)
    
        // Web API routes  
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "AuthenticationApi",
            routeTemplate: "auth/controller/id",
            defaults: new  id = RouteParameter.Optional 
        );

        config.Routes.MapODataServiceRoute("ODataRoute", "api", GenerateEdmModel());

        var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    

    private static IEdmModel GenerateEdmModel()
    
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 

        return builder.GetEdmModel();
    


现在我在网上尝试了许多不同的解决方案,但都无济于事,以下是我尝试过的东西的链接:

Web api not supporting POST method

Web API Put Request generates an Http 405 Method Not Allowed error

http://blog.dontpaniclabs.com/post/2013/01/23/That-Pesky-Requested-Resource-Does-Not-Support-HTTP-Method-POST-Error-When-Using-MVC-Web-API

【问题讨论】:

LinkLogin 上有 Route 属性吗? [Route("LinkLogin")] 当我添加时,我收到以下错误:'未在控制器'管理'上找到与请求匹配的操作。 您能否向我们确认您的函数“public async Task LinkLogin(string provider)”在名为“Manage”的控制器中? LinkLogin 是否也需要添加 [HttpPost] 属性? 提供者值是如何设置的?我认为您的方法需要具有提供程序参数public async Task&lt;IHttpActionResult&gt; LinkLogin([FromBody]string provider) 的 [FromBody] 属性 【参考方案1】:

我讨厌回答我自己的问题。如果其他人遇到此问题,那是因为您尝试将简单的字符串值发送到 Web api 控制器。

我成功使用了这个解决方案:http://jasonwatmore.com/post/2014/04/18/Post-a-simple-string-value-from-AngularJS-to-NET-Web-API.aspx

如果链接失效,您只需在 POST 请求中将字符串值用双引号括起来,如下所示:

$http.post(Config.apiUrl + '/processfile', '"' + fileName + '"');

【讨论】:

以上是关于$http.post 的 Web API 405 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用$ http.post时HTTP 405无效方法(HTTP动词)

从 Angular 向 Asp.net 发送 post 请求时出现错误 405

405 方法不允许 Web API 2

Web Api - 不允许使用 Catch 405 方法

405 方法不允许 Web API

Http post 405方法不允许