[英]POSTing data to ASP.NET WEB API Service from Node.js
我目前正在开发一个应用程序,以允许公司的高管从任何地方执行某些操作。 我的Node.js部分充当Internet与公司内部LAN之间的代理,并在公司LAN上调用一些ASP.NET WEB API服务来处理Active Directory身份验证(以便执行人员可以使用其Windows登录)以及存储和检索数据。从SQL Server 2008。
ASP.Net AuthenticateUser()函数接受包含userId和pas的HTTP POST请求,并返回包含客户端可用来对请求进行签名的哈希的JSON对象。 当我将userId和密码作为查询参数传递时,它可以正常工作,但是当我尝试将它们嵌入到请求正文中时,它会失败。 工作版本如下所示。 ( 注:我省略了错误处理以提高清晰度。)
namespace Approver.Controllers
{
public class UtilityController : ApiController
{
public UserInfo AuthenticateUser(string userId, string password)
{
return UtilityBo.AuthenticateUser(userId, password);
}
}
}
有效的Node.js代码(即Express中的路由)如下所示。
exports.login = function(req, res){
var userId = req.body.userId;
var password = req.body.password;
var postData = 'userId='+userId+'&password='+password;
});
var options = {
host: res.app.settings['serviceHost'],
port: res.app.settings['servicePort'],
path: '/api/Utility/AuthenticateUser?userId='+userId+'&password='+password,
method: 'POST',
header: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': postData.length
}
};
http.request(options, function(resp){
resp.setEncoding('utf8');
var arr = '';
resp.on('data', function (chunk){
arr += chunk;
});
resp.on('end', function (){
var data = JSON.parse(arr);
res.writeHead(200, {'Content-Type': 'application/json',});
res.end(JSON.stringify(data));
});
}).end(JSON.stringify(postData));
当我更改代码以仅接受来自正文的数据时,IIS返回HTTP 500错误。 新的WEB API服务如下所示。
namespace Approver.Controllers
{
public class UtilityController : ApiController
{
public UserInfo AuthenticateUser(UserAuthentication userAuth)
{
return UtilityBo.AuthenticateUser(userAuth);
}
}
}
namespace Approver.Models
{
public class UserAuthentication
{
[Required]
public string UserId { get; set; }
[Required]
public string Password { get; set; }
}
}
新的Node代码只是从URL中剥离查询参数。
经过一些测试后,我意识到Web api从未将数据插入模型中,因此userAuth始终具有空值。 但是,我尝试通过Chrome的REST控制台发布数据,并且该数据有效,因此Node.js片段必须包含错误。 我该如何解决?
我认为您在Uri遇到的“模型绑定”问题。
尝试显式指定FromUri
属性。
namespace Approver.Controllers
{
public class UtilityController : ApiController
{
public UserInfo AuthenticateUser([FromUri] UserAuthentication userAuth)
{
return UtilityBo.AuthenticateUser(userAuth);
}
}
}
如果要同时从body和uri绑定参数,请尝试使用
namespace Approver.Controllers
{
public class UtilityController : ApiController
{
public UserInfo AuthenticateUser([ModelBinder] UserAuthentication userAuth)
{
return UtilityBo.AuthenticateUser(userAuth);
}
}
}
本文很好地了解了ASP.NET Web API中的模型绑定
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.