gpt4 book ai didi

c# - 在 asp.net web api 中支持 @odata.bind(在发布期间链接到现有实体)

转载 作者:太空狗 更新时间:2023-10-29 17:59:10 25 4
gpt4 key购买 nike

我很难从 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 linkedEntities = (Model.LinkedEntityCollection)entityResource;
linkedEntities.Add(navigationPropertyName, referencedEntityUrl);
}
}
}
}

LinkedEntityCollection 是用作字典的我的实体类的基类(MyEntity : LinkedEntityCollection 实现很简单)。

public class ExtendedODataDeserializerProvider : ODataDeserializerProvider
{
private static ExtendedODataDeserializerProvider _instance = null;

private ExtendedODataDeserializerProvider()
{
_instance = this;
}

public static ExtendedODataDeserializerProvider Instance
{
get { return _instance ?? new ExtendedODataDeserializerProvider(); }
}

public override ODataEdmTypeDeserializer GetEdmTypeDeserializer(Microsoft.OData.Edm.IEdmTypeReference edmType)
{
return DefaultODataDeserializerProvider.Instance.GetEdmTypeDeserializer(edmType);
}

public override ODataDeserializer GetODataDeserializer(Microsoft.OData.Edm.IEdmModel model, Type type, System.Net.Http.HttpRequestMessage request)
{
return new ExtendedODataEntityDeserializer(DefaultODataDeserializerProvider.Instance);
}
}

在http配置中注册:

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

// registering entities: builder.EntitySet<T>("EntityName") ...

ODataBatchHandler batchHandler = new DefaultODataBatchHandler(new HttpServer(config));
batchHandler.MessageQuotas.MaxOperationsPerChangeset = 10;
batchHandler.MessageQuotas.MaxPartsPerBatch = 10;

var odataFormatters = ODataMediaTypeFormatters.Create(DefaultODataSerializerProvider.Instance, ExtendedODataDeserializerProvider.Instance);

config.Formatters.Clear();
config.Formatters.AddRange(odataFormatters);

config.MapODataServiceRoute(routeName: "Central", routePrefix: "Odata", model: builder.GetEdmModel(), batchHandler: batchHandler);
}

但是,如果您确实使用了此 hack,您将失去在实体之间创建链接的能力,如本文所述:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/entity-relations-in-odata-v4

“@odata.id”未被解析,假定它是函数 ODataEntityDeserializer.Read 中的一个实体。也许我在这里从根本上遗漏了一些东西,因为我对 web api 还很陌生(config.Formatters.Clear() 似乎有点苛刻)。或者是否有任何其他解决方法来支持 @odata.bind?

是否有可能在不久的将来实现此功能?

更新

我的 hack 开始工作了。问题是我应该从 DefaultODataDeserializerProvider 而不是 ODataDeserializerProvider 派生 ExtendedODataDeserializerProvider 并相应地返回反序列化器:

public override ODataDeserializer GetODataDeserializer(
Microsoft.OData.Edm.IEdmModel model,
Type type,
System.Net.Http.HttpRequestMessage request)
{
if (type == typeof(ODataActionParameters) ||
type == typeof(ODataUntypedActionParameters) ||
type == typeof(Uri))
{
return base.GetODataDeserializer(model, type, request);
}

return new ExtendedODataEntityDeserializer(DefaultODataDeserializerProvider.Instance);
}

所以剩下的问题是:我们什么时候在 asp.net webapi odata 中获得 @odata.bind 支持?

最佳答案

尝试回答

So the question that remains: when do we get @odata.bind support in asp.net webapi odata?

在 vnext 仓库中似乎有一个与此相关的功能。但是,该问题被标记为影响较小。 https://github.com/OData/WebApi/milestones/vNext因此无法知道何时实现此功能。

关于c# - 在 asp.net web api 中支持 @odata.bind(在发布期间链接到现有实体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30871984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com