2

私は現在、会社の幹部がどこからでも特定のアクションを実行できるようにするアプリに取り組んでいます。私のNode.jsは、インターネットと会社の内部LANの間のプロキシとして機能し、会社のLAN上のいくつかのASP.NET WEB APIサービスを呼び出して、Active Directory認証(エグゼクティブがWindowsログオンを使用できるようにする)とデータの保存と取得を処理します。 SQLServer2008から。

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はHTTP500エラーを返します。新しいWEBAPIサービスは次のようになります。

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; } 
  } 
}

新しいノードコードは、URLからクエリパラメータを削除するだけです。

いくつかのテストを行った後、Web APIがモデルにデータを挿入しないことに気付きました。そのため、userAuthには常にnull値が含まれていました。ただし、ChromeのRESTコンソールを介してデータを投稿しようとしましたが、機能したため、Node.jsの部分にエラーが含まれている必要があります。これを修正するにはどうすればよいですか?

4

1 に答える 1

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); 
    } 
  } 
}

この記事では、ASP.NETWebAPIでのモデルバインディングについての優れた洞察を提供します。

于 2013-01-08T15:24:57.253 に答える