我可以使用WCF数据服务客户端使用JSON光格式而无需引用服务元数据吗?

时间:2013-03-25 03:01:15

标签: wcf-data-services odata

我有一个使用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;

我希望能够使用JSON格式而无需像Atom一样指定IEdmModel。这可能吗?

1 个答案:

答案 0 :(得分:0)

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

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