如何使用网络 API 格式化日期时间

本文关键字:日期 时间 格式化 API 何使用 网络 | 更新日期: 2023-09-27 18:32:15

我在C#中使用Web Api构建了一个简单的Web服务。

我有这个方法:

[Route("secsocdata/{id:int?}")]
[HttpGet]
public HttpResponseMessage getSecSocData(int? id = null)
{
    try
    {
    return Request.CreateResponse(HttpStatusCode.OK, new RCamera((short)status_code.Success, "Ok", getSecSocImages(id)));
    }
    catch (Exception e)
    {
    return Request.CreateResponse(HttpStatusCode.InternalServerError, new RMessage((short)status_code.Exception, HttpStatusCode.InternalServerError.ToString()));
    }
}
[NonAction]
private IQueryable<WSOmniacare.Models.AAHome.ImmaginiSecSoc.ImmaginiSecSocDTO> getSecSocImages(int? id)
{
   var strItem = from u in db_data.CAMERA_SEC_SOC
          where u.ID == id
          select u.Image;
    String imageBas64 = GetString(strItem.First());
    if (id != null)
    {
    return from u in db_data.CAMERA_SEC_SOC 
           where u.ID == id
           select new WSOmniacare.Models.AAHome.ImmaginiSecSoc.ImmaginiSecSocDTO()
           {
           image = imageBas64,
           image_width = u.image_width,
           image_height= u.image_height,
           type = u.type,
           timestamp = u.timestamp.ToString("MM/dd/yyyy HH:mm:ss.fff",
            CultureInfo.InvariantCulture),
           rectangle = new WSOmniacare.Models.AAHome.ImmaginiSecSoc.ImmaginiSecSocDTO.Rectangle()
           {
             rects = from pi in db_data.CAMERA_SEC_SOC_Rectangles 
                where pi.ID_SecSoc  == id
                 select new WSOmniacare.Models.AAHome.ImmaginiSecSoc.ImmaginiSecSocDTO.Rectangle.Rect()
                {   
                height= pi.height,
                width = pi.width,
                x = pi.x,
                y=pi.y
                }
           } 
           };
    }
    return null;
}

因此,如果我尝试调用此 Web 服务,则会出现此错误:

{ "消息": "发生错误。 "ExceptionMessage": "'ObjectContent 1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.", "ExceptionType": "System.InvalidOperationException", "StackTrace": null, "InnerException": { "Message": "An error has occurred.", "ExceptionMessage": "LINQ to Entities does not recognize the method 'System.String ToString(System.String, System.IFormatProvider)' method, and this method cannot be translated into a store expression.", "ExceptionType": "System.NotSupportedException", "StackTrace": " in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)'r'n in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)'r'n in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator 1.Translate(ExpressionConverter parent, Expression linq)''r' in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)''r' in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MemberInitTranslator.TypedTranslate(ExpressionConverter parent, MemberInitExpression linq)''r' in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator 1.Translate(ExpressionConverter parent, Expression linq)'r'n in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)'r'n in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)'r'n in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)'r'n in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)'r'n in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)'r'n in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)'r'n in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)'r'n in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator 1.Translate(ExpressionConverter parent, Expression linq)''r' in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)''r' in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.Convert()''r' in System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable 1 forMergeOption)'r'n in System.Data.Entity.Core.Objects.ObjectQuery 1.<>c__DisplayClass7.b__6()''r' in System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func 1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)'r'n in System.Data.Entity.Core.Objects.ObjectQuery 1.<>c__DisplayClass7.b__5()''r' in System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func 1 operation)'r'n in System.Data.Entity.Core.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption)'r'n in System.Data.Entity.Core.Objects.ObjectQuery 1..GetEnumerator>b__0()''r' in System.Data.Entity.Internal.LazyEnumerator'1.MoveNext()''r' in Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)''r' inNewtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)''r' in Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)''r' inNewtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)''r' in Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)''r' in Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)''r' inNewtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)''r' in System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)''r' in System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)''r' in System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, StreamwriteStream, HttpContent content)''r' in System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancelToken cancelToken)''r'--- Fine traccia dello stack da posizione precedente dove è stata generata l'eccezione ---''r' in System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)''r' in System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)''r' in System.Runtime.CompilerServices.TaskAwaiter.GetResult()''r' in System.Web.Http.WebHost.HttpControllerHandler.d__1b.移动下一个()" } }

现在我认为问题出在我插入这行代码时:

timestamp = u.timestamp.ToString("MM/dd/yyyy HH:mm:ss.fff",
                                CultureInfo.InvariantCulture),

如果我使用这个

timestamp = u.timestamp.ToString(),

而不是

timestamp = u.timestamp.ToString("MM/dd/yyyy HH:mm:ss.fff",
                                    CultureInfo.InvariantCulture),

我的代码有效。我该如何修复它?

如何使用网络 API 格式化日期时间

看起来db_data是DbContext,CAMERA_SEC_SOC_Rectangles是DbSet。因此,您希望执行 Linq-to-SQL 查询。当您使用 Linq over DbSet 时,您的 Linq 查询将转换为相应的 SQL 查询。似乎您的Linq-to-SQL驱动程序无法将函数转换为字符串(格式,文化信息)到sql函数。所以我为你看到了 2 个选项:

  1. 从 Linq 查询中删除不受支持的 ToString:以 DateTime 格式提取时间戳,然后使用 C# 对其进行处理。
  2. 查找 C# 函数用于可转换为 sql 函数的日期格式。