Asp.net web api 使用带有自定义注释的DataServiceContext

Asp.net web api 使用带有自定义注释的DataServiceContext,asp.net-web-api,odata,wcf-data-services,Asp.net Web Api,Odata,Wcf Data Services,当使用DataServiceContext类的一个实例来实现来自odata端点(该端点公开了一些注释)的对象时,如何获取注释数据。我看不到任何明显的扩展点。自定义注释在DataServiceContext上没有作为一级概念公开,但您可以通过连接到客户端响应处理管道来访问它们。此代码将在每个实体读取完毕后运行: context.Configurations.ResponsePipeline.OnEntryEnded( entryArgs => DoSomething(entryArg

当使用DataServiceContext类的一个实例来实现来自odata端点(该端点公开了一些注释)的对象时,如何获取注释数据。我看不到任何明显的扩展点。

自定义注释在DataServiceContext上没有作为一级概念公开,但您可以通过连接到客户端响应处理管道来访问它们。此代码将在每个实体读取完毕后运行:

context.Configurations.ResponsePipeline.OnEntryEnded(
    entryArgs => DoSomething(entryArgs.Entry.InstanceAnnotations));

在内部,WCF数据服务客户端使用一个名为ODataLib(NuGet上的又名Microsoft.Data.OData)的低级库。响应和请求管道允许您在需要时深入到较低级别以获取额外信息,但您仍然可以获得使用成熟的WCF数据服务客户端库的所有便利。在处理管道上使用的类,如ODataEntry、ODataFeed等,都是ODataLib API的一部分。

Ok非常感谢您的回复。我猜这意味着上下文不是线程安全的。上下文的构造和初始化是否代价高昂,如果是的话,我是否应该实现一个对象池。正确,上下文对象不是线程安全的。DataServiceContext类的实例化/配置成本不是很高,因此我认为您每次都可以创建一个新的类。我发现,当反序列化ODataComplexValue的ODataCollectionValue时,它会失败,并显示一条非常奇怪的消息:找到了一个具有“odata.type”属性批注的复杂属性。复杂属性不能具有“odata.type”属性批注,而应将“odata.type”指定为复杂值中的实例批注。这意味着负载具有类似MyProperty@odata.type而不是“MyProperty:{odata.type=…}”对不起,我的语法在这里很混乱。。我认为作为一个单独的问题,这可能更容易。(除非这是一个仅在响应管道中发生的错误?)