【发布时间】: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