C# 带有Microsoft.OData.Edm.Date参数的OData函数导致Swashback出错

C# 带有Microsoft.OData.Edm.Date参数的OData函数导致Swashback出错,c#,odata,swagger,swashbuckle,C#,Odata,Swagger,Swashbuckle,我将Swashback.OData 3.2.0和Swashback.Core 5.5.3集成到我的WepAPI-OData Web服务中,以生成Swagger文档。 当我尝试访问swagger端点时,出现以下异常,这似乎是由函数AppointsForUsers引起的,该函数采用了Microsoft.OData.Edm.Date类型的2个参数,而日期类型不包含时间组件。 当我注释掉注册函数中的var function=builder,function…部分时,一切正常, 当我将参数类型Micros

我将Swashback.OData 3.2.0和Swashback.Core 5.5.3集成到我的WepAPI-OData Web服务中,以生成Swagger文档。 当我尝试访问swagger端点时,出现以下异常,这似乎是由函数AppointsForUsers引起的,该函数采用了Microsoft.OData.Edm.Date类型的2个参数,而日期类型不包含时间组件。 当我注释掉注册函数中的var function=builder,function…部分时,一切正常, 当我将参数类型Microsoft.OData.Edm.Date替换为System.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) 
{
...
}
有了这个解决方法,我仍然可以使用日期作为参数,例如。 任命FrusersDateFrom=2017-04-07,。。。。
实际参数包含一个时间组件,具体取决于时区,但在内部,我继续从DateTime进行日期隐式转换。虽然最初的问题仍然存在,但至少对我们来说效果很好。

如果使用操作而不是函数可以解决问题。。。 您是否尝试使用接收ODataActionParameters对象的操作作为此处所述的参数

另一种选择是创建一个具有三个参数的模型,并将其作为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"];        
}
public async Task<IHttpActionResult> AppointmentsForUsers(ODataActionParameters parameters) 
{
    Date fromDate = (Date)parameters["FromDate"];
    Date toDate = (Date)parameters["ToDate"];
    Enumerable[int] UserIds= (Enumerable[int])parameters["UserIds"];
}
 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"];        
}