【问题标题】:Can I use JSON light format using WCF Data Services Client without referencing service metadata?我可以在不引用服务元数据的情况下使用 WCF 数据服务客户端使用 JSON 灯光格式吗?
【发布时间】:2013-03-25 03:01:14
【问题描述】:

我有一个正在使用 WCF 数据服务 OData 服务的客户端应用程序(两者都是 v5.3.0)。我希望客户端应用程序使用 JSON 与服务进行通信,而不是使用默认的 Atom Pub XML。

如果不提供 IEdmModel 实例,这是否可行?使用Atom格式时可以这样做:

        var ctx = new DataServiceContext(_oDataSvcUri, DataServiceProtocolVersion.V3)
        {
            IgnoreMissingProperties = true
        };

        // this isn't explicitly needed, as it uses Atom by default
        ctx.Format.UseAtom();

        return ctx;

要使用 JSON,这是一个示例:

        var ctx = new DataServiceContext(_oDataSvcUri, DataServiceProtocolVersion.V3)
            {
                IgnoreMissingProperties = true
            };

        const string svcMetadata = "*insert contents of http://example.com/YourData.svc/$metadata here*";

        var xmlReader = XmlReader.Create(new StringReader(svcMetadata));

        IEdmModel edmModel = EdmxReader.Parse(xmlReader);

        ctx.Format.UseJson(edmModel);

        ctx.ResolveName = type => type.FullName;
        ctx.ResolveType = typeName => Type.GetType(typeName + ", " + "MyDomainModelAssemblyName");

        return ctx;

我希望能够在不指定 IEdmModel 的情况下使用 JSON 格式,就像使用 Atom 一样。这可能吗?

【问题讨论】:

    标签: wcf-data-services odata


    【解决方案1】:

    如果没有服务器模型客户端,则无法使用 WCF 数据服务客户端读取 JSON Light 有效负载。 JSON Light 有效负载干净且小巧,正是因为它们假定客户端了解服务器模型,并且可以计算使用该模型遗漏的所有额外元数据。

    但是,您不一定必须使用 EdmxReader 自己解析服务器的 $metadata 文档。如果您在 Visual Studio 中使用“添加服务引用”生成客户端类并使用派生的 DataServiceContext 类(而不是直接使用 DataServiceContext),则生成的派生类已经设置了一些配置,让您无需调用ctx.Format.UseJson()明确提供模型。

    【讨论】:

    • 感谢您的回复,珍。包含服务器端模型的程序集在客户端可供我使用(我拥有两者),我所追求的是一种使用 JSON 使用服务而无需更新任何服务引用/更新元数据 xml 的方法我的客户端应用程序中的文件或字符串。似乎这应该是可能的,因为我在调用 DataServiceContext 上的 CreateQuery 方法时传入了要反序列化的类型:dataServiceContext.CreateQuery<MyEntityType>("MyEntitySetName");
    • 不幸的是,仅靠类型是不够的。客户端需要完整的模型才能读取 JSON Light。如果您无法更新服务引用或更改客户端上的字符串资源,您可以使用 EdmLib 中的可构造 API(可通过 Microsoft.Data.Edm dll 中的 Microsoft.Data.Edm.Library 命名空间获得)来创建一个IEdmModel 的实例。例如:EdmModel model = new EdmModel();模型.AddElement(新实体类型(...))。 API 的使用应该是相当容易发现的,但是如果你有问题,请询问那里(如果你决定走这条路)。
    • 那应该是“new EdmEntityType()”,而不是“new EntityType()”,但我超过了 5 分钟编辑 cmets 的时间限制 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多