【问题标题】:WebAPI not found未找到 WebAPI
【发布时间】:2013-08-24 23:55:32
【问题描述】:

遗憾的是,我无法使用 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 出了什么问题?

【问题讨论】:

  • 试试data: "{ username: 'admin', password: 'MyPass' }"-

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


【解决方案1】:

这篇文章应该有助于回答您的一些问题。

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;
}

【讨论】:

    【解决方案2】:

    几件事。 Yahia 的更改是有效的。此外,POST 需要在 WebAPI 中获得一点指导才能知道在哪里查找数据。在我看来这很愚蠢。如果您知道这是 POST,请查看消息正文。无论如何,将您的 POST 更改为此,一切都会奏效。该属性告诉 WebAPI 在正文中查找,模型进行绑定。

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

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

    应该很好地适应这些变化。

    【讨论】:

      【解决方案3】:

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

      } 希望对您有所帮助;)

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多