WEB API序列不包含任何元素

时间:2017-10-22 14:02:42

标签: c# linq asp.net-web-api2

我创建了一个WEB API,它正在我的本地系统上工作。但是在服务器上部署它之后,它给了我错误/异常。

  

{"消息":"发生错误。"," ExceptionMessage":"序列   包含没有   元素"" ExceptionType":" System.InvalidOperationException""堆栈跟踪":"   在System.Linq.Enumerable.First [TSource](IEnumerable 1 source)\r\n at System.Linq.Queryable.First[TSource](IQueryable 1 source)\ r \ n at   ActualWebService.Controllers.MetersController.GetByMsn(String msn,   DateTime dt)"}

我正在服务器上的邮递员和本地系统中检查

以下是我的代码

 public HttpResponseMessage GetByMsn(string msn, DateTime dt)
    {          
        try
        {

            var result = medEntitites.tj_xhqd.Where(m => m.zdjh == msn)
                                             .OrderByDescending(o => o.sjsj)
                                             .Select(s => s.sjsj)
                                             .First();

            DateTime resulted = new DateTime();
            DateTime userSent = new DateTime();

            resulted = Convert.ToDateTime(result);
            userSent = Convert.ToDateTime(dt);


            double diff = Math.Abs((resulted - userSent).TotalMinutes); // here i am checking the difference between the user sent datetime and resulted date time

            if (diff <=10)
            {
                return Request.CreateResponse(HttpStatusCode.OK, new { data = new { Response = "Yes"} });
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.OK, new { data = new { Response = "No" } });
            }

        }
        catch (Exception ex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
        }
    }

WebApiConfig

 config.Routes.MapHttpRoute(
       name: "GetByMsn",
       routeTemplate: "api/{controller}/{action}/{msn}/{dt}",
       defaults: null,
       constraints: new { msn = @"^[0-9]+$" , dt = @"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$" }
       );

SERVER LOCAL网址: http://localhost:8080/api/meters/GetByMsn/0002999000536/2017-10-21T18:26:08

我不知道为什么这个API无效LIVE,因为它正在本地系统上工作。它也可以在服务器上运行。

任何帮助都将受到高度赞赏

1 个答案:

答案 0 :(得分:1)

当源序列为空时,First()扩展方法将抛出异常。在这种情况下,看起来你的LINQ表达式中where子句没有返回有效的集合,因此你得到了这个错误。

您应该使用FirstOrDefault()并在继续之前检查它是否为空。

var result = medEntitites.tj_xhqd.Where(m => m.zdjh == msn)
                                             .OrderByDescending(o => o.sjsj)
                                             .Select(s => s.sjsj)
                                             .FirstOrDefault();
if(result==null)
{
  return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
}

FirstOrDefault()方法返回满足条件的序列的第一个元素,如果没有找到这样的元素则返回默认值。如果没有符合您条件的记录,您将获得null