背景:
我有一个非常大的OData模型,目前正在使用WCF数据服务(OData)来公开它.但是,微软已经表示WCF数据服务已经死亡,Web API OData就是他们的目标.
所以我正在研究如何使Web API OData与WCF数据服务一起工作.
问题设置:
模型的某些部分不需要保护,但有些部分需要保护.例如,客户列表需要安全性来限制谁可以读取它,但我有其他列表,如产品列表,任何人都可以查看.
Customers实体有许多可以访问它的关联.如果您计算2个级别的关联,那么可以通过关联(通过关联)获得数百种方式.例如Prodcuts.First().Orders.First().Customer.由于客户是我系统的核心,因此您可以从大多数实体开始,最终将您的方式与客户列表相关联.
WCF数据服务有一种方法可以通过以下方法为特定实体提供安全性:
[QueryInterceptor("Customers")]
public Expression<Func<Customer, bool>> CheckCustomerAccess()
{
return DoesCurrentUserHaveAccessToCustomers();
}
Run Code Online (Sandbox Code Playgroud)
当我看到Web API OData时,我没有看到这样的东西.另外,我非常担心,因为我正在制作的控制器在跟随关联时似乎没有被调用.(意思是我不能把安全放在CustomersController.)
我担心我将不得不尝试以某种方式列举协会如何获得客户并为每个客户提供安全性的所有方式.
问题:
有没有办法将安全性放在Web API OData中的特定实体上? (无需枚举所有可能以某种方式扩展到该实体的关联?)
我有一个相当大的数据模型,我想使用OData V4协议使用Web API OData公开.
基础数据存储在SQL Server 2012数据库中.该数据库中包含许多DateTime列.
当我接线时,我收到一个错误,即不支持System.DateTime.
所以这是我的问题,我该怎么做才能在OData Feed中看到我的DateTime列?
注意:我无法返回并将所有列更改为DateTimeOffset列.
我尝试更改Entity Framework edmx中列的类型,但它给了我这个错误:
指定的成员映射无效."MyProject.MyEntity"类型中成员'MyPropertyHere'的类型'Edm.DateTimeOffset [Nullable = False,DefaultValue =,Precision =]'与'SqlServer.datetime不兼容[Nullable = False,DefaultValue =,Precision = 3] '成员'MyColumnName''类型'MyDataModel.Store.MyEntity'.
(基本上认为DateTime与DateTimeOffset不兼容.)
Web API OData团队真的只是遗漏了需要使用SQL Server类型的所有人DateTime吗?
更新:我找到了相关的解决方法,但他们需要更新EF模型才能使用它们.如果我能避免,我宁愿不必单独更新几百个属性.
更新:这个问题让我意识到微软管理其OData产品的方式存在很大的缺陷.有很多问题,但这个问题最为明显.Web API OData中存在巨大的缺失功能. 插件的交易和排序是其中两个.这两个项目(在OData规范中并且在Microsoft杀死它之前在WCF数据服务中)对于任何真实系统都是至关重要的.
但是,他们决定花时间去删除对许多开发人员非常有用的功能,而不是将时间放在那些缺少OData规范功能的关键位置.它体现了糟糕的管理,以便在添加急需的功能时优先删除工作功能.
我尝试与Web API OData代表讨论这些问题,最后,我打开了一个问题/票证,几天后关闭了.那是他们愿意做的结束.
正如我所说,Web API OData的管理还有很多问题(与DateTime无关,所以我不会在这里列出). 我一直是OData的坚定支持者,但Web API OData管理层的明显问题迫使我和我的团队/公司放弃了它.
幸运的是,可以设置普通的Web API以使用OData语法.设置控制器的工作量更大,但最终工作得很好.它支持DateTime.(并且似乎管理层至少可以远离制定疯狂的错误决策.)
我正在尝试使用OData和EntityFramework创建一个带有"简单"web api的新ASP.NET Core项目.我之前使用OData与旧版本的ASP.NET.
我已经设置了一个只有一个简单的get函数的控制器.我已经设法使用基本的OData命令作为过滤器和顶部,但我无法使扩展命令工作.我想这是因为我无法弄清楚如何在Startup.cs中设置它.我尝试过很多东西,包括跟随Github的一些odata样本:
https://github.com/OData/WebApi/tree/vNext/vNext/samples/ODataSample.Web https://github.com/bigfont/WebApi/tree/master/vNext/samples/ODataSample.Web
在我的启动文件中,我尝试从Service类中排除一些根本没有效果的属性.所以问题可能在于我使用IDataService接口的方式.(ApplicationContext像样本一样实现它)
要明确我正在使用完整的.NET Framework创建一个ASP.NET Core web api,而不仅仅是.Core框架.我当前的代码是两个样本中最好/最差的混合,并且我可以过滤WebAPI,但不能让它扩展或隐藏属性.
任何人都可以看到我缺少的东西og有一个工作的ASP.NET Odata样本.我是startup.cs中整个设置的新手?猜猜我正在找一个做过这项工作的人.
调节器
[EnableQuery]
[Route("odata/Services")]
public class ServicesController : Controller
{
private IGenericRepository<Service> _serviceRepo;
private IUnitOfWork _unitOfWork;
public ServicesController(IGenericRepository<Service> serviceRepo, IUnitOfWork unitOfWork)
{
_serviceRepo = serviceRepo;
_unitOfWork = unitOfWork;
}
[HttpGet]
public IQueryable<Service> Get()
{
var services = _serviceRepo.AsQueryable();
return services;
}
}
Run Code Online (Sandbox Code Playgroud)
启动
using Core.DomainModel;
using Core.DomainServices;
using Infrastructure.DataAccess;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.OData.Extensions;
namespace Web
{
public class Startup …Run Code Online (Sandbox Code Playgroud) c# odata asp.net-web-api-odata asp.net-core asp.net-core-webapi
我正在使用OData Web API for Version 4,当我尝试使用$top参数查询OData web Api时,它会返回以下异常消息.
URI中指定的查询无效.已超出Top查询的限制"0".传入请求的值为"10"
我使用Apache Ignite dotNet LINQ作为数据源而不是Entity Framework,我的OData控制器操作方法如下:
[EnableQuery]
public IQueryable<Productioncurvepnl> GetProductioncurvepnl()
{
Console.WriteLine("Starting query to ignite");
var q = AIgniteClient.IgniteClient.Instance.ProductionCurvePnLCache.AsCacheQueryable().Select(c => c.Value);
return q;
}
Run Code Online (Sandbox Code Playgroud) Web API OData v7。我正在为CSV,Excel等编写自定义格式器。我不知道如何将自定义格式器(ODataMediaTypeFormatter)指向自定义类,以在其中修改输出。
CustomFormatter:ODataMediaTypeFormatter-具有MessageWriterSettings.MediaTypeResolver,在7版中不再存在
调试时,进入GetPerRequestFormatterInstance,然后它死于A。找不到与响应的内容类型匹配的受支持的MIME类型。
我无法弄清楚流程-如何将其绑定到我的自定义(ODataWriter)编写器(csv或我想创建的任何内容)。
例如,从git的示例中:
public class CustomFormatter : ODataMediaTypeFormatter
{
private readonly string csvMime = ;
public CustomFormatter(params ODataPayloadKind[] kinds)
: base(kinds) {
//----no longer exists in 7
//MessageWriterSettings.MediaTypeResolver = new MixResolver();
SupportedEncodings.Add(Encoding.UTF8);
SupportedEncodings.Add(new UTF8Encoding(encoderShouldEmitUTF8Identifier: false));
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv"));
}
}
public class MixResolver : ODataMediaTypeResolver
{
public override IEnumerable<ODataMediaTypeFormat> GetMediaTypeFormats(ODataPayloadKind payloadKind)
{
if (payloadKind == ODataPayloadKind.Resource || payloadKind == ODataPayloadKind.ResourceSet)
{
return CsvMediaTypeResolver.Instance.GetMediaTypeFormats(payloadKind);
}
return base.GetMediaTypeFormats(payloadKind);
}
}
public class …Run Code Online (Sandbox Code Playgroud) c# odata asp.net-web-api asp.net-web-api-odata asp.net-web-api2
有没有什么方法可以只计算响应有效负载中的数据而没有任何值数组?
我正在使用带有Webapi 2.2的ODataV4.0.目前,当我查询以下内容时,它会返回所有值和计数:
http://odata/People?$count=true
我只需要喜欢"@odata.count":1, "value":[]或不喜欢的东西"value".
是这项工作的唯一方法吗?
我收到以下错误:
控制器"客户端"中操作"GetClients"上的路径模板"GetClients()"不是有效的OData路径模板.找不到"GetClients"细分受众群的资源.
我的控制器方法看起来像这样
public class ClientsController : ODataController
{
[HttpGet]
[ODataRoute("GetClients(Id={Id})")]
public IHttpActionResult GetClients([FromODataUri] int Id)
{
return Ok(_clientsRepository.GetClients(Id));
}
}
Run Code Online (Sandbox Code Playgroud)
我的WebAPIConfig文件有
builder.EntityType<ClientModel>().Collection
.Function("GetClients")
.Returns<IQueryable<ClientModel>>()
.Parameter<int>("Id");
config.MapODataServiceRoute(
routeName: "ODataRoute",
routePrefix: "odata",
model: builder.GetEdmModel());
Run Code Online (Sandbox Code Playgroud)
我希望能够像这样调用odata rest api:
http://localhost/odata/GetClients(Id=5)
Run Code Online (Sandbox Code Playgroud)
知道我做错了什么吗?
c# odata asp.net-web-api asp.net-web-api-routing asp.net-web-api-odata
我们目前正在研究在我们的Web API中使用OData查询语法.我们不打算实现完整的OData实现 - 仅仅利用查询语法.
通常认为将应用程序分成多个层是一种很好的应用程序架构.在现代Web应用程序中,这些层将包括数据层和UI /传输层,它可以在将数据发送给客户时对存储在数据库中的信息进行不同的建模.
例如:您可能有一个如下所示的数据库(实体框架)模型:
public class Employee
{
public Guid Id {get; set;}
public string Name {get; set;}
public int AccessLevel {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
但是您的Web API可能会以不同的有线格式向客户公开这些数据:
public class EmployeeDto
{
public string Name {get; set;}
public string SecurityClearence {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
使用ASP.NET Web API和(可能是??)Microsoft ASP.NET Web API OData库我们如何实现一个场景,我们的客户可以根据DTO格式编写查询,例如:
?$filter=(SecurityClearence eq 'TopSecret')
Run Code Online (Sandbox Code Playgroud)
......然后我们会根据我们的数据格式进行翻译.例如:
?filter=(AccessLevel eq 007)
Run Code Online (Sandbox Code Playgroud)
或其他一些格式,允许我动态查询我的数据库,如表达式.例如:
db.Employees.Where(translatedExpression);
Run Code Online (Sandbox Code Playgroud)
我已经想到了几种手动实现这一目标的方法,但我很想知道其他人如何解决这个问题,因为我觉得到目前为止我的实现是非常粗糙的,不太可能经得起审查.
是否有Web API OData库(以及相关的EDM库)的功能可以为我实现部分或全部功能?
c# expression ado.net-entity-data-model asp.net-web-api asp.net-web-api-odata
我很难从WCF数据服务迁移到web api odata v4.我坚持以下问题:
odata web api似乎不支持@ odata.bind.
我找到了以下链接:https:
//github.com/OData/WebApi/issues/158
有人建议实现自己的ODataEntityDeserializer派生类,如下所示:
public class ExtendedODataEntityDeserializer : ODataEntityDeserializer
{
public ExtendedODataEntityDeserializer(ODataDeserializerProvider deserializerProvider) : base(deserializerProvider)
{
}
public override void ApplyNavigationProperty(
object entityResource,
ODataNavigationLinkWithItems navigationLinkWrapper,
IEdmEntityTypeReference entityType,
ODataDeserializerContext readContext)
{
base.ApplyNavigationProperty(entityResource, navigationLinkWrapper, entityType, readContext);
foreach (var childItem in navigationLinkWrapper.NestedItems)
{
var entityReferenceLink = childItem as ODataEntityReferenceLinkBase;
if (entityReferenceLink != null)
{
var navigationPropertyName = navigationLinkWrapper.NavigationLink.Name;
Uri referencedEntityUrl = entityReferenceLink.EntityReferenceLink.Url;
if (!referencedEntityUrl.IsAbsoluteUri)
{
referencedEntityUrl = new Uri(readContext.Request.RequestUri, referencedEntityUrl);
}
var …Run Code Online (Sandbox Code Playgroud) 因此,使用the ODataController,你可以控制返回的内容,如果有人这样做/odata/Foos(42)/Bars,因为你会被调用,FoosController所以:
public IQueryable<Bar> GetBars([FromODataUri] int key) { }
Run Code Online (Sandbox Code Playgroud)
但是,如果你想控制什么时候返回什么/odata/Foos?$expand=Bars呢?你怎么处理那件事呢?它会触发此方法:
public IQueryable<Foo> GetFoos() { }
Run Code Online (Sandbox Code Playgroud)
而且我认为它只是.Include("Bars")在IQueryable<Foo>你返回时做的,所以...我如何得到更多的控制?特别是,我如何以OData不破坏的方式进行操作(例如$ select,$ orderby,$ top等继续工作.)