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

问题描述 投票:0回答:2

我正在开发一个带有数据库的Azure Web应用程序。我有一个数据库的模型和控制器。我正在尝试在数据库上发布数据,但是在理解为什么在将数据从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) 
{
    //
}

error 404 on post request with Json data Json对象类:

public class JsonSuscribeModel
{
    public Utilisateur user { get; set; }
    public string guid { get; set; }
    public string password2 { get; set; }
}
c# angularjs http http-status-code-404 azure-web-sites
2个回答
1
投票

你错过了端点,因为它不知道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(这本身就是一个承诺),然后在服务中处理它并返回另一个承诺?你可以简单地返回$ 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;
        })

这样您就可以返回整个$ http,并指示它返回成功和错误的内容。由于它本身是一个承诺,它将表现得像以前一样。


0
投票

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

public IHttpActionResult PostGTW_Utilisateur(JsonSuscribeModel JsonModel)
© www.soinside.com 2019 - 2024. All rights reserved.