【问题标题】:Using a DataServiceContext with custom annotations使用带有自定义注释的 DataServiceContext
【发布时间】:2013-10-30 06:01:18
【问题描述】:

当使用 DataServiceContext 类的实例从一个 odata 端点具体化对象时,该端点公开了一些 custom annotations,如何获取注释数据。我看不到任何明显的扩展点。

【问题讨论】:

    标签: asp.net-web-api odata wcf-data-services


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的,非常感谢您的回复。我想这意味着上下文不是线程安全的。上下文的构造和初始化成本高吗,如果是的话,我也许应该实现一个对象池。
    • 正确,上下文对象不是线程安全的。实例化/配置对于 DataServiceContext 类来说不是很昂贵,所以我认为你每次都可以创建一个新的。
    • 我发现当反序列化 ODataComplexValue 的 ODataCollectionValue 时,它​​会失败并显示一条相当奇怪的消息:找到了带有“odata.type”属性注释的复杂属性。复杂属性不得具有“odata.type”属性注释,而应将“odata.type”指定为复杂值中的实例注释。
    • 这意味着有效载荷有类似“MyProperty@odata.type”而不是“MyProperty:{odata.type=...}” 对不起,我的语法在这里很乱。我想这可能作为一个单独的问题更容易。 (除非这是仅在响应管道中发生的错误?)
    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2022-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多