C# asp.net web api中对@odata.bind的支持(发布期间链接到现有实体)
我在从WCF数据服务迁移到web api odata v4时遇到了一段非常困难的时间。我被困在以下问题上: odata web api似乎不支持@odata.bind。 我找到了以下链接: 有人建议实现自己的C# asp.net web api中对@odata.bind的支持(发布期间链接到现有实体),c#,odata,asp.net-web-api-odata,C#,Odata,Asp.net Web Api Odata,我在从WCF数据服务迁移到web api odata v4时遇到了一段非常困难的时间。我被困在以下问题上: odata web api似乎不支持@odata.bind。 我找到了以下链接: 有人建议实现自己的ODataEntityDeserializer派生类,如下所示: public class ExtendedODataEntityDeserializer : ODataEntityDeserializer { public ExtendedODataEntityDeserializ
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
实现很简单)
在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);
}
那么剩下的问题是:我们什么时候在asp.net webapi odata中获得@odata.bind支持 试图回答
那么剩下的问题是:我们什么时候在asp.net webapi odata中获得@odata.bind支持
vnext回购协议中似乎有一个与此相关的功能。然而,这一问题的影响很小。
因此,无法知道何时将实施此功能。谢谢。如果aps.net web api odata团队的人能够就此发表声明,那就太好了。我发现这个特性非常相关,尤其是当您必须迁移现有的WCF数据时Service@Jeldrik我认为,如果你提出新的问题说明你的担忧,他们会在GitHub回购协议中做出回应。祝你好运!再次感谢。github()上已经存在一个公开问题,asp.net web api odata团队几乎没有响应。这项功能似乎计划在V5.6版推出,但目前推迟到V5.7版(但我仍持怀疑态度)。我有自己的定制serialier,想注册它。我正在使用config.Formatters.InsertRange(0,mycustomformatter)。但是,如果在此之前我没有清除(),它将不起作用。我向您提出的问题是:在添加格式化程序之前,您是否仍在清除?或者您是否找到了其他方法?我仍在按上述方式使用它(清除,然后添加格式化程序)。从那时起,我所做的唯一更改是,我还将JsonMediaTypeFormatter和XmlMediaTypeFormatter添加到Formatter集合中。既然这对我有效,我就不再寻找替代方案了。
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);
}
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);
}