找不到Web API

时间:2013-08-24 23:55:33

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api

可悲的是,我无法获得使用WebAPI的最基本的东西

$.ajax({
    url: "https://192.168.1.100/Api/Authentication/LogIn",
    type: "POST",
    contentType: "application/json",
    data: "{ 'username': 'admin', 'password': 'MyPass' }",
    error: function (r, s, e) { alert(e); },
    success: function (d, s, r) { alert(s); }
});

我得到“未找到”

API控制器定义

public class AuthenticationController : ApiController
{
    [HttpPost]
    public bool LogIn(string username, string password)
    {
        return true;
    }
}

如果我删除HttpPost并用HttpGet替换它,然后执行

$.ajax({
    url: "https://192.168.1.100/Api/Authentication/LogIn?username=admin&password=MyPass",
    type: "GET",
    error: function (r, s, e) { alert(e); },
    success: function (d, s, r) { alert(s); }
});

工作正常。

WebAPI出了什么问题?

4 个答案:

答案 0 :(得分:6)

本文应该有助于回答您的一些问题。

http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

  

我相信这里的想法是,特别是在RESTful API中,您需要将数据绑定到特定方法处理的单个资源。因此,将数据推送到几个松散的参数并不是Web API所采用的那种用法。

处理发布数据时,您可以告诉您的操作方法正确绑定其参数:

public class LoginDto {
    public string Username { get; set; }
    public string Password { get; set; }
}

[HttpPost]
public bool LogIn(LoginDto login) {
    // authenticate, etc
    return true;
}

答案 1 :(得分:2)

一些事情。 Yahia的改变是有效的。此外,POST需要在WebAPI中有一点方向才能知道在哪里查找数据。我认为这很愚蠢。如果您知道它是POST,请查看邮件正文。无论如何,将POST改为此,事情就会奏效。该属性告诉WebAPI查看正文,模型进行绑定。 enter image description here

AuthModel只是一个包含用户名和密码属性的简单模型。由于WebApi希望绑定到输入的方式,这将使您的生活更轻松。

请阅读此处了解更多详情: http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part-1

应该善于应对这些变化。

答案 2 :(得分:0)

如果使用多个参数,则WebAPI中的绑定不起作用。 虽然在MVC控制器中同样有效。 在WebAPI中,使用类来绑定两个或多个参数。阅读有用的文章: http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/ 您可以通过以下方式解决: 1.在MVC动作中做同样的事情(它有效) 2.保持无参数发布和读取请求  [HttpPost] [ActionName("login")] public async Task<bool> Post() { var str= await Request.Content.ReadAsStringAsync(); // 3.将参数封装到类,如gyus提示

} 希望它有所帮助;)

答案 3 :(得分:0)

POST动作只能有1个身体...... 没有办法发送2个实体(在你的情况下是2个字符串)。 因此,WebAPI解析器希望在URL中找到它而不是在body中。 您可以通过放置属性并设置一个参数来自URL而另一个参数来自body来解决它。 通常,当方法中只有一个对象参数时 - 不需要属性[FromBody]。 字符串应该在URL中。

所以 - 您可以尝试将它们作为参数发送到URL中(就像您在GET中所做的那样) 或者 - 构建一个包装它的类。

我强烈建议您使用POST进行登录操作。