当前位置: 首页 > 知识库问答 >
问题:

具有 Microsoft.OData.Edm.Date 参数的 OData 函数,导致 Swashbuckle 出错

董翰池
2023-03-14

我整合了Swashbuckle。OData 3.2.0和Swashbuckle。我的WepAPI OData webservice中的Core 5.5.3来生成Swagger documentaion。当我试图访问swaggerendpoint(http://localhost:52460/swagger)时,我得到了下面的异常,这似乎是由一个函数(AppointmentsForUsers)引起的,该函数采用了两个Microsoft类型的参数。OData.Edm.Date(不含时间成分的日期类型)。当我注释掉< code>var function = builder,function...在我的Register函数中,当我替换参数类型Microsoft时,一切都工作正常。OData.Edm.Date与系统。DateTimeOffset也很好,但这不是我们/我们项目的解决方案。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ODataModelBuilder builder = new ODataConventionModelBuilder();

        builder.EntitySet<UserDTO>("Users");
        builder.EntitySet<AppointmentDTO>("Appointments");

        var function = builder.Function("AppointmentsForUsers");
        function.ReturnsCollectionFromEntitySet<AppointmentDTO>("Appointments");
        function.Parameter<Date>("FromDate");
        function.Parameter<Date>("ToDate");
        function.CollectionParameter<int>("UserIds");

        config.MapODataServiceRoute(
            routeName: "odata",
            routePrefix: "odata",
            model: builder.GetEdmModel());
    }
}

public async Task<IHttpActionResult> AppointmentsForUsers(Date DateFrom, Date DateTo, Enumerable<int> UserIds) 
{
...
}

我在浏览器中得到的错误是:

500:{“Message”:“发生错误。”,“ExceptionMessage”,“Der DateTimeOffset Text\”2015-12-12T12:00\“sollte das Format\”yyyy mm ddThh:mm:ss('.s)?(zzzzzz)?\“aufweisen,und jeder Feldwert muss innerhalb des gültigen Bereichs liegen”,”ExceptionType“:”Microsoft.OData.ODataException“,”StackTrace“:”bei Microsoft.ODData.UriUtils.ConvertUriStringToDateTimeOffset字符串文本,日期时间偏移

信息的德语部分

' der datetime offset-Text \ " 2015-12-12t 12:00 \ " sollte das Format \ " yyyy-mm-ddThh:mm:ss(' . 's)?(zzzzzz)?“好了,费尔德斯特先生一定要把一切都记在心里。”

表示:日期时间偏移量文本 \“2015-12-12T12:00\” 的格式应为 “yyyy-mm-ddThh:mm:ss(')。s )?(zzzzzz)?\“,并且每个字段值必须在有效范围内

m DateTimeOffset-Wert '2015-12-12T12:00:00' fehlen die Zeitzoneninformationen.Ein DateTimeOffset-Wert muss Zeitzoneninformationen enthalten.”

意味着:DateTimeOffset值缺少时区信息。DateTimeOffset值必须包含时区信息。

这是个bug吗?除了不使用日期类型之外,还有其他解决方法吗?任何帮助都将不胜感激。

我还在Swashbuckle.Odata Github网站上打开了一个问题:https://github.com/rbeauchamp/Swashbuckle.OData/issues/134

更新:作为解决方法,我将参数类型更改为系统.日期时间

public async Task<IHttpActionResult> AppointmentsForUsers(DateTime DateFrom, DateTime DateTo, Enumerable<int> UserIds) 
{
...
}

有了这个解决方法,我仍然可以使用日期作为参数,例如约会用户(日期从=2017-04-07,……实际参数包含时间组件(取决于时区),但在内部我继续使用日期(从日期时间隐式转换)。至少对我们来说效果很好,尽管最初的问题仍然存在。

共有1个答案

郭思淼
2023-03-14

如果使用操作而不是函数可以成为解决方案…您是否尝试使用接收ODataActionParameter对象的操作作为此处描述的参数?:

https://learn . Microsoft . com/en-us/aspnet/we b-API/overview/odata-support-in-aspnet-we b-API/odata-v4/odata-actions-and-functions

public async Task<IHttpActionResult> AppointmentsForUsers(ODataActionParameters parameters) 
{
    Date fromDate = (Date)parameters["FromDate"];
    Date toDate = (Date)parameters["ToDate"];
    Enumerable[int] UserIds= (Enumerable[int])parameters["UserIds"];
}

另一种选择是创建一个包含三个参数的模型,并将其作为 ODataActionParameter 传递。

 var function = builder.Action("AppointmentsForUsers");
        function.ReturnsCollectionFromEntitySet<AppointmentDTO>("Appointments");
        function.Parameter<ModelWithDatesAndUsers >("Model");

public class ModelWithDatesAndUsers
{
    Date fromDate;
    Date toDate;
    Enumerable[int] userIds;
}

public async Task<IHttpActionResult> AppointmentsForUsers(ODataActionParameters parameters) 
{
         ModelWithDateAndUsers model= (ModelWithDatesAndUsers)parameters["Model"];        
}
 类似资料:
  • 我最近开始在Windows上用C语言编写程序,并一直在努力小心处理字符串缓冲区的不同方式。例如,接受最大字符数的,包括null获取缓冲区大小的,单位为TCHARs(我假设这也包括null)。尽管它们的措辞不同,一个使用,而另一个使用(为什么类型不同?),行为是一样的,对吗? 两者都返回复制的字符串的长度,不包括null,因此我应该能够重复调用其中一个,将缓冲区大小加倍,直到返回的长度小于传入的缓冲

  • 问题内容: 当我有许多可以引发异常的表达式时,例如: 有没有处理这些表达式通过某种方法 一个 功能 ,将返回一些默认值(或空)如果一个参数是无效的,并抛出一个异常-这可能发生,如果,例如: 这样我就不需要用try-catch块包围每个表达式或检查每个点是否为null。 问题答案: 用途: 这设置为链中是否有任何东西。 如果只想在非空值的情况下设置其值,请删除分配,并将其更改为:

  • 问题内容: 在Python的psycopg2中将参数指定为execute()时,如下所示: 我收到此错误: 我究竟做错了什么?看起来psycopg2在查询中添加了单引号,而这些单引号导致了语法错误。 如果我不使用参数,它将正常工作: 问题答案: 我相信这样的参数化语句应与 值 一起使用,而不是与表名(或SQL关键字等)一起使用。因此,您基本上对此感到不走运。 但是,请不要担心,因为该机制旨在防止S

  • 问题内容: 我有一个特定的问题。我有一个包含无效值的表。我需要用大于的先前值替换无效值(此处)。 困难在于,使用Update或insert(游标和update可以做到)对我来说是不合适的。我唯一的方法是使用Select语句。 当我将-函数与when一起使用时,我只会得到一列具有正确值的列。 内容: 预期查询结果: 问题答案: 结果 :

  • 我已经用Eclipse编写了一个Java应用程序,该应用程序使用SWT作为UI。(请参阅运行jar:异常时的SWT异常线程"main"org.eclipse.swt.SWT异常:无效线程访问的详细信息)。 我导出为JAR,但很难让它从Finder和Terend运行。我终于用让它从终端运行 然而,当我从eclipse导出为JAR时,我仍然无法让它运行。这是因为它导出时需要与它捆绑在一起的参数。然后我

  • 我是新的Android和Java,并试图使基于位置的应用程序。 编辑 我做了一个非常非常简单的测试代码,得到了同样的错误。这是java: 我也犯了同样的错误。以下是我的应用程序级构建中的依赖项。格雷德尔: 原帖 我试图使用ViewModel和LiveData来更新用户位置,因为我知道这是生命周期感知的最佳方式。我有一个默认的地图活动... 一个扩展LiveData以存储用户位置的类。。。 以及一个