从Node.js将数据发布到ASP.NET WEB API服务

时间:2013-01-08 14:56:53

标签: asp.net node.js express asp.net-web-api

我目前正在开发一款应用,让我公司的管理人员可以随时随地执行某些操作。我的Node.js片段充当Internet和我公司内部LAN之间的代理,并调用公司LAN上的一些ASP.NET WEB API服务来处理Active Directory身份验证(因此执行者可以使用他们的Windows登录)并存储和检索数据来自SQL Server 2008.

ASP.Net AuthenticateUser()函数接受包含userId和pas的HTTP POST请求,并返回包含客户端可用于签署请求的哈希的JSON对象。当我通过userId& amp;密码作为查询参数,但当我尝试将它们嵌入请求体中时失败。工作版本如下所示。 (注意:我省略了错误处理以提高清晰度。)

    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文件必须包含错误。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我认为你在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); 
    } 
  } 
}

This article可以很好地了解ASP.NET Web API中的模型绑定