2017-05-11 20 views
0

でRegexを使用してIEnumerableコレクションをフィルタリングする例外が発生しました。ASP.NET MVC + Web APIプロジェクトでPOSTメソッドを使用しています。問題は、正規表現を適用して英数字以外の文字を消去するIEnumerableコレクションの結果をフィルタリングしたいということです。ASP.NET Web APIのC#

プログラムがその行に到達するたびに、「値はnullではありません」という「ArgumentNullException」がスローされます。 Regex.Replaceメソッドに問題があると思われるので、メソッドが受け取っているパラメータがあることが分かりましたので、成功しないでデバッグしようとしました。

最初は、トランザクションスコープの外で宣言された静的属性であるため、リポジトリを使用してIEnumerableコレクションを間違った方法で埋めると思っていました。だから私は範囲内に別のリポジトリインスタンスを作成しましたが、それは問題を解決しませんでした。

ご協力いただければ幸いです。ありがとうございました。

[HttpPost] 
    public object Post(string token, [FromBody]ExternoApi externo) 
    { 
     var ValidateToken = TokensRepository.Validate(token); 

     if (ValidateToken == null) 
      throw new NotImplementedException(string.Format("El token ID = \"{0}\" no se encuentra habilitado o aun no se realizo el emparejamiento.", token)); 

     if (externo == null) 
      throw new ParameterNullException(string.Format("Debe informar un externo.")); 

     Externo externoNew; 

     var scope = new TransactionScope(TransactionScopeOption.RequiresNew, 
       new TransactionOptions() 
       { 
        IsolationLevel = IsolationLevel.ReadCommitted 
       } 
      ); 

     using (scope) 
     { 
      IExternoRepository _repository = new ExternoRepository(); 

      try 
      { 
       externoNew = new Externo() 
       { 
        dsNombre = externo.dsNombre, 
        dsApellido = externo.dsApellido, 
        dsDocumento = externo.dsDocumento, 
        IdCliente = externo.IdCliente, 
        dsPatente = externo.dsPatente, 
        dtCreado = DateTime.Now, 
        dtModificado = DateTime.Now 
       }; 

       Regex rgx = new Regex("[^a-zA-Z0-9]"); 
       string pattern = "[^a-zA-Z0-9]"; 
       var _externos = _repository.GetAll(); 

       //var _ExternoExistente = _externos.Where(x => rgx.Replace(x.dsDocumento, "") == rgx.Replace(externoNew.dsDocumento, "") 
       //        && rgx.Replace(x.dsPatente, "") == rgx.Replace(externoNew.dsPatente, "") 
       //        && rgx.Replace(x.IdCliente, "") == rgx.Replace(externoNew.IdCliente, "")).OrderBy(x => x.IdExterno).FirstOrDefault(); 

       This line throws exception --------> var _ExternoExistente = _externos.Where(x => Regex.Replace(x.dsDocumento, pattern, "") == Regex.Replace(externoNew.dsDocumento, pattern, "") 
          && Regex.Replace(x.dsPatente, pattern, "") == Regex.Replace(externoNew.dsPatente, pattern, "") 
          && Regex.Replace(x.IdCliente, pattern, "") == Regex.Replace(externoNew.IdCliente, pattern, "")).OrderBy(x => x.IdExterno).FirstOrDefault(); 

       if (_ExternoExistente == null) 
       { 
        externoNew = _repository.Add(externoNew); 
       } 
       else { 
        externoNew = _ExternoExistente; 
       } 

       if (!string.IsNullOrEmpty(externo.binaryImage)) 
       { 

        var filename = string.Format("E{0}.jpg", externo.IdExterno); 

        string uploadFolder = WebConfigurationManager.AppSettings["UploadFolder"] != null ? WebConfigurationManager.AppSettings["UploadFolder"] : "upload"; 
        string path = Path.Combine(HostingEnvironment.ApplicationPhysicalPath, uploadFolder); 
        if (!Directory.Exists(path)) Directory.CreateDirectory(path); 
        var imageExterno = ImageEngine.StringToImage(externo.binaryImage); 
        imageExterno.Save(Path.Combine(path, filename)); 

        externoNew.dsPath = string.Concat("~/", uploadFolder, "/", filename); 
        _repository.Update(externoNew); 
       } 

       var externoDB = _repository.Get(externoNew.IdExterno); 
       string strPath = HostingEnvironment.ApplicationPhysicalPath; 
       scope.Complete(); 

       return new ExternoApi() 
       { 
        IdExterno = externoDB.IdExterno, 
        dsNombre = externoDB.dsNombre, 
        dsApellido = externoDB.dsApellido, 
        dsDocumento = externoDB.dsDocumento, 
        IdCliente = externoDB.IdCliente, 
        binaryImage = !string.IsNullOrEmpty(externoDB.dsPath) ? ImageEngine.ImageToString(string.Concat(strPath, externoDB.dsPath.Replace("~/", "").Replace("/", "\\"))) : "", 
        dsPatente = externoDB.dsPatente, 

       }; 
      } 
      catch (Exception ex) 
      { 
       scope.Dispose(); 

       var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 

       IApiLogRepository _repoLog = new ApiLogRepository(); 
       var log = new ApiLog(); 
       log.IdDispositivo = ValidateToken.IdDispositivo; 
       log.dsLog = string.Concat("Dispositivo: ", ValidateToken.IdDispositivo, "\n", ex.Message, "\n || \n", (ex.InnerException != null ? ex.InnerException.Message : ""), (ex.InnerException != null && ex.InnerException.InnerException != null ? ex.InnerException.InnerException.Message : "")); 
       log.dsRequest = serializer.Serialize(externo); 
       _repoLog.Add(log); 

       throw new DataRestrictDBException(string.Concat(ex.InnerException != null && ex.InnerException.InnerException != null ? ex.InnerException.InnerException.Message : (ex.InnerException != null ? ex.InnerException.Message : ex.Message), "Externo: ", externo)); 
      } 
     } 
    } 
+0

コードをデバッグし、その行にブレークポイントを挿入します。次に、変数を監視するか、変数上にマウスポインタを置くだけで、どの値がnullであるかを確認します。 –

+0

私は既にそれを行いましたが、IEnumerableコレクションの反復をどのようにデバッグできますか?私は "externoNew"変数の値をチェックすることしかできません。デルタ式でメソッドをデバッグする方法はありますか? – jmrivas

+1

その場合は、最初に 'var t = _externos.ToList()'を呼び出してみてください。すべてのアイテムがリストにあるので、それらを調べてください。問題が見つかったら、修正して 'IEnumerable'に戻してください。 –

答えて

1

externo.dsDocumentoまたはx.dsDocumentoどちらかが ヌルでなければならないような何かを行うことができます:ここでは

は(-------->で示されている)問題のラインと私の方法があります:

_externos.Where(x => x.dsDocumento != null && externoNew.dsDocumento != null && Regex.Replace(x.dsDocumento, pattern, "") == Regex.Replace(externoNew.dsDocumento, pattern, "") 
+0

私は本当にばかげた質問をしたことに気付きました。それはちょうどデバッグの問題でしたが、私はそれを見ることができませんでした。ご協力ありがとうございました。 – jmrivas