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

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

我目前正在开发一款应用程序,让我公司的高管可以从任何地方执行某些操作。我的 Node.js 片段充当互联网和公司内部 LAN 之间的代理,并调用公司 LAN 上的一些 ASP.NET WEB API 服务来处理 Active Directory 身份验证(以便执行人员可以使用 Windows 登录)以及存储和检索数据来自 SQL Server 2008。

ASP.Net AuthenticateUser() 函数接受包含 userId 和 pas 的 HTTP POST 请求,并返回一个包含哈希值的 JSON 对象,客户端可以使用该哈希值对请求进行签名。当我将用户 ID 和密码作为查询参数传递时,它工作正常,但当我尝试将它们嵌入到请求正文中时,它会失败。工作版本如下所示。 (注意:我省略了错误处理以提高清晰度。)

    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 的模型绑定(bind)中遇到了问题。

尝试显式指定 FromUri 属性。

namespace Approver.Controllers 
{
  public class UtilityController : ApiController 
 {
    public UserInfo AuthenticateUser([FromUri] UserAuthentication userAuth) 
    {
      return UtilityBo.AuthenticateUser(userAuth); 
    } 
  } 
}

如果您希望参数从 body 和 uri 绑定(bind),请尝试使用

namespace Approver.Controllers 
{
  public class UtilityController : ApiController 
 {
    public UserInfo AuthenticateUser([ModelBinder] UserAuthentication userAuth) 
    {
      return UtilityBo.AuthenticateUser(userAuth); 
    } 
  } 
}

This article深入了解 ASP.NET Web API 中的模型绑定(bind)

关于asp.net - 从 Node.js 将数据发布到 ASP.NET WEB API 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14217710/

相关文章:

c# - asp.net 找不到资源?

javascript - 同一控件上的多个 ASP.NET 验证器 - Page_Validator.isValid 始终保持 true

asp.net - HTTP POST - 我卡住了

javascript - 从 node.js 服务器加载脚本的正确 src= 属性是什么

Node.js 不同行为响应

mysql - 当我使用 Sequelize 的文字时,没有结果

javascript - Express.js跨域 session 不保存

c# - 如何从字符串类型转换为数据行

javascript - 插入时node.js mysql错误 'ECONNRESET'

javascript - 将 Chartist.JS 放入 Jade 中