为什么更改控制器的参数会引发 http Post 404 错误?

Why does changing controller's parameter provoke http Post 404 error?

我正在开发带有数据库的 Azure Web 应用程序。我有一个数据库模型和控制器。我正在尝试 Post 数据库中的数据,但在理解为什么从 Web 客户端向控制器发送数据时此代码会发送 404 错误时遇到了一些问题。

以下是我在 AngularJS 中发送数据的方式(参数是 Json 字符串):

$http({
        method: 'post',
        url: serviceBasePath + "/api/suscribe",
        data: parameter,
        headers: { 'Content-Type': 'application/json' }
    }).then(function (response) {
        userService.SetCurrentUser(response.data);
        defer.resolve(response.data);
    }, function (error) {
        defer.reject(error.data);
    })

在控制器方面,如果控制器是:

,我会得到 404
[HttpPost]
[Route("api/suscribe")]
public IHttpActionResult PostGTW_Utilisateur(String JsonString)
{
    //
}

但是如果我将模型作为参数,404 错误就消失了:

[HttpPost]
[Route("api/suscribe")]
public IHttpActionResult PostGTW_Utilisateur(User u) 
{
    //
}

Json 对象 class :

public class JsonSuscribeModel
{
    public Utilisateur user { get; set; }
    public string guid { get; set; }
    public string password2 { get; set; }
}

感谢您的提示。 解决方案是使用我的 JsonModel 作为参数:

public IHttpActionResult PostGTW_Utilisateur(JsonSuscribeModel JsonModel)

您错过了端点,因为它不知道 JsonString 是什么。你发送了一个 JSON 但在控制器模型中,你告诉它监听字符串。打开 Chrome(或其他)开发工具并准确查看您随请求发送的内容。

这是另一个提示:

$http({
        method: 'post',
        url: serviceBasePath + "/api/suscribe",
        data: parameter,
        headers: { 'Content-Type': 'application/json' }
    }).then(function (response) {
        userService.SetCurrentUser(response.data);
        defer.resolve(response.data);
    }, function (error) {
        defer.reject(error.data);
    })

我已经看到很多次滥用承诺。为什么要使用 $http(这本身就是一个承诺)然后在服务中处理它并 return 另一个承诺?您可以简单地 return $http(并在控制器中解决它的承诺。无论如何,您将不得不解决这个新的承诺,所以为什么要多一个步骤。

 return $http({
            method: 'post',
            url: serviceBasePath + "/api/suscribe",
            data: parameter,
            headers: { 'Content-Type': 'application/json' }
        }).then(function (response) {
            userService.SetCurrentUser(response.data);
            return response.data;
        }, function (error) {
            return error.data;
        })

这样你 return 整个 $http 并且你指示它 return 成功和错误的内容。因为它本身就是一个承诺,它将像以前一样表现。