【问题标题】:Exception thrown filtering IEnumerable collection using Regex on ASP.NET Web API C#在 ASP.NET Web API C# 上使用 Regex 过滤 IEnumerable 集合引发异常
【发布时间】:2017-10-09 19:48:10
【问题描述】:

我正在我的 ASP.NET MVC + Web API 项目中使用 POST 方法。问题是我想过滤应用正则表达式以清除非字母数字字符的 IEnumerable 集合的结果。

每当程序到达该行时,它就会抛出一个“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));
            }
        }
    }

【问题讨论】:

  • 调试代码并在该行放置一个断点。然后使用 watch 或将鼠标指针悬停在变量上检查哪些值为 null。
  • 我已经这样做了,但是如何调试 IEnumerable 集合的迭代?我只能检查“externoNew”变量的值。有没有办法用 delta 表达式调试方法?
  • 在这种情况下,请先尝试致电var t = _externos.ToList()。现在所有项目都在列表中,调查它们。找到问题后,修复并恢复到IEnumerable
  • 我意识到我提出了一个非常愚蠢的问题。这只是调试问题,但我看不到它。感谢您的帮助。

标签: c# asp.net regex exception asp.net-web-api


【解决方案1】:

externo.dsDocumento 或 x.dsDocumento 必须为 null 可以做类似的事情:

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

【讨论】:

  • 我意识到我提出了一个非常愚蠢的问题。这只是调试问题,但我看不到它。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
相关资源
最近更新 更多