【转】OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service Client

一、概念介绍

1.1,什么是OData?

还是看OData官网的简单说明:

An open protocol to allow the creation and consumption of queryable and interoperable RESTful APIs in a simple and standard way.

这是一个开放的数据查询和服务协议,目前已经有众多厂商和平台支持,已经形成了完整的生态链,这应该是未来数据查询的标准,参见官网说明。

OData的意义还在于,它能够大大简小SOA架构里面服务的粒度,只需要提供一个OData数据源,而查询工作交给客户端去做即可,这将大大减少服务端服务方法定义的数量。

OData的版本现在已经是V4了,之前的很多类库都是基于V1-V3版本的。现在的V4版本已经很完善了,而且成为了工业标准,所以现在可以放心的在项目中使用了。

1.2,OData on .NET

OData 的前身是WCF Data Service,后来演变成跨平台的数据查询协议,现在,除了WCF支持OData,ASP.NET WebAPI 已经内置支持OData了,这将获得一种轻量级的,Rest架构的OData访问方案,本文将讲解如何在VS 2013上搭建一个OData 服务和客户端程序。

1.3,参考资源

在阅读本文之前,首先建议你参考下面的OData 学习资源,本文也是根据这里的资源整理而成,之所以要重新整理一次,是因为原文说的并不清楚,给出的示例程序有些小小的问题,而且国内有关OData的文章介绍非常少。

http://www.odata.org/blog/how-to-use-web-api-odata-to-build-an-odata-v4-service-without-entity-framework/
http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint
http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-client-app

本文的实例程序相关代码请在此下载。

二、OData WebAPI搭建

2.1,创建项目

新建一个ASP.NET WebAPI 项目,名字是 ODataWebApplication ,如下图:

OData1_20150331222025

注意选择一个空项目,并购选WebAPI,单击确定。

2.2,添加Asp.Net OData 支持

打开VS2013的程序包管理器控制台,在下面输入 Install-Package Microsoft.AspNet.OData 命令,如下图:

OData2_20150331223057

这里会添加很多附属的程序集文件,下面是一个详细的清单列表,如果你的符合下面的内容,就表示安装成功了:

复制代码

键入“get-help NuGet”以查看所有可用的 NuGet 命令。PM> Install-Package Microsoft.AspNet.OData 
正在尝试解析依赖项“Microsoft.AspNet.WebApi.Client (≥ 5.2.2)”。 
正在尝试解析依赖项“Newtonsoft.Json (≥ 6.0.4)”。 
正在尝试解析依赖项“Microsoft.AspNet.WebApi.Core (≥ 5.2.2 && < 5.3.0)”。 
正在尝试解析依赖项“Microsoft.OData.Core (≥ 6.10.0 && < 7.0.0)”。 
正在尝试解析依赖项“Microsoft.Spatial (= 6.10.0)”。 
正在尝试解析依赖项“Microsoft.OData.Edm (= 6.10.0)”。 
正在安装“Newtonsoft.Json 6.0.8”。 
已成功安装“Newtonsoft.Json 6.0.8”。 
正在安装“Microsoft.AspNet.WebApi.Client 5.2.3”。 
您正在从 Microsoft 下载 Microsoft.AspNet.WebApi.Client,有关此程序包的许可协议在 http://www.microsoft.com/web/webpi/eula/net_library_eula_ENU.htm 上提供。请检查此程序包是否有其他依赖项,这些依赖项可能带有各自的许可协议。您若使用程序包及依赖项,即构成您接受其许可协议。如果您不接受这些许可协议,请从您的设备中删除相关组件。 
已成功安装“Microsoft.AspNet.WebApi.Client 5.2.3”。 
正在安装“Microsoft.AspNet.WebApi.Core 5.2.3”。 
您正在从 Microsoft 下载 Microsoft.AspNet.WebApi.Core,有关此程序包的许可协议在 http://www.microsoft.com/web/webpi/eula/net_library_eula_ENU.htm 上提供。请检查此程序包是否有其他依赖项,这些依赖项可能带有各自的许可协议。您若使用程序包及依赖项,即构成您接受其许可协议。如果您不接受这些许可协议,请从您的设备中删除相关组件。 
已成功安装“Microsoft.AspNet.WebApi.Core 5.2.3”。 
正在安装“Microsoft.Spatial 6.10.0”。 
您正在从 Microsoft Corporation 下载 Microsoft.Spatial,有关此程序包的许可协议在 http://go.microsoft.com/?linkid=9809688 上提供。请检查此程序包是否有其他依赖项,这些依赖项可能带有各自的许可协议。您若使用程序包及依赖项,即构成您接受其许可协议。如果您不接受这些许可协议,请从您的设备中删除相关组件。 
已成功安装“Microsoft.Spatial 6.10.0”。 
正在安装“Microsoft.OData.Edm 6.10.0”。 
您正在从 Microsoft Corporation 下载 Microsoft.OData.Edm,有关此程序包的许可协议在 http://go.microsoft.com/?linkid=9809688 上提供。请检查此程序包是否有其他依赖项,这些依赖项可能带有各自的许可协议。您若使用程序包及依赖项,即构成您接受其许可协议。如果您不接受这些许可协议,请从您的设备中删除相关组件。 
已成功安装“Microsoft.OData.Edm 6.10.0”。 
正在安装“Microsoft.OData.Core 6.10.0”。 
您正在从 Microsoft Corporation 下载 Microsoft.OData.Core,有关此程序包的许可协议在 http://go.microsoft.com/?linkid=9809688 上提供。请检查此程序包是否有其他依赖项,这些依赖项可能带有各自的许可协议。您若使用程序包及依赖项,即构成您接受其许可协议。如果您不接受这些许可协议,请从您的设备中删除相关组件。 
已成功安装“Microsoft.OData.Core 6.10.0”。 
正在安装“Microsoft.AspNet.OData 5.5.0”。 
您正在从 Microsoft 下载 Microsoft.AspNet.OData,有关此程序包的许可协议在 http://www.microsoft.com/web/webpi/eula/net_library_eula_ENU.htm 上提供。请检查此程序包是否有其他依赖项,这些依赖项可能带有各自的许可协议。您若使用程序包及依赖项,即构成您接受其许可协议。如果您不接受这些许可协议,请从您的设备中删除相关组件。 
已成功安装“Microsoft.AspNet.OData 5.5.0”。 
正在从 ODataWebApplication 删除“Microsoft.AspNet.WebApi.Client.zh-Hans 5.0.0”。 
已成功将“Microsoft.AspNet.WebApi.Client.zh-Hans 5.0.0”从 ODataWebApplication 中删除。 
正在从 ODataWebApplication 删除“Microsoft.AspNet.WebApi.Core.zh-Hans 5.0.0”。 
已成功将“Microsoft.AspNet.WebApi.Core.zh-Hans 5.0.0”从 ODataWebApplication 中删除。 
正在从 ODataWebApplication 删除“Microsoft.AspNet.WebApi.Client 5.0.0”。 
已成功将“Microsoft.AspNet.WebApi.Client 5.0.0”从 ODataWebApplication 中删除。 
正在从 ODataWebApplication 删除“Newtonsoft.Json 5.0.6”。 
已成功将“Newtonsoft.Json 5.0.6”从 ODataWebApplication 中删除。 
正在将“Newtonsoft.Json 6.0.8”添加到 ODataWebApplication。 
已成功将“Newtonsoft.Json 6.0.8”添加到 ODataWebApplication。 
正在将“Microsoft.AspNet.WebApi.Client 5.2.3”添加到 ODataWebApplication。 
已成功将“Microsoft.AspNet.WebApi.Client 5.2.3”添加到 ODataWebApplication。 
正在从 ODataWebApplication 删除“Microsoft.AspNet.WebApi.Core 5.0.0”。 
已成功将“Microsoft.AspNet.WebApi.Core 5.0.0”从 ODataWebApplication 中删除。 
正在将“Microsoft.AspNet.WebApi.Core 5.2.3”添加到 ODataWebApplication。 
已成功将“Microsoft.AspNet.WebApi.Core 5.2.3”添加到 ODataWebApplication。 
正在将“Microsoft.Spatial 6.10.0”添加到 ODataWebApplication。 
已成功将“Microsoft.Spatial 6.10.0”添加到 ODataWebApplication。 
正在将“Microsoft.OData.Edm 6.10.0”添加到 ODataWebApplication。 
已成功将“Microsoft.OData.Edm 6.10.0”添加到 ODataWebApplication。 
正在将“Microsoft.OData.Core 6.10.0”添加到 ODataWebApplication。 
已成功将“Microsoft.OData.Core 6.10.0”添加到 ODataWebApplication。 
正在将“Microsoft.AspNet.OData 5.5.0”添加到 ODataWebApplication。 
已成功将“Microsoft.AspNet.OData 5.5.0”添加到 ODataWebApplication。 
正在将“Microsoft.AspNet.WebApi.Client.zh-Hans 5.2.3”添加到 ODataWebApplication。 
正在安装“Microsoft.AspNet.WebApi.Client.zh-Hans 5.2.3”。 
您正在从 Microsoft 下载 Microsoft.AspNet.WebApi.Client.zh-Hans,有关此程序包的许可协议在 http://www.microsoft.com/web/webpi/eula/net_library_eula_CHS.htm 上提供。请检查此程序包是否有其他依赖项,这些依赖项可能带有各自的许可协议。您若使用程序包及依赖项,即构成您接受其许可协议。如果您不接受这些许可协议,请从您的设备中删除相关组件。 
已成功安装“Microsoft.AspNet.WebApi.Client.zh-Hans 5.2.3”。 
已成功将“Microsoft.AspNet.WebApi.Client.zh-Hans 5.2.3”添加到 ODataWebApplication。 
正在将“Microsoft.AspNet.WebApi.Core.zh-Hans 5.2.3”添加到 ODataWebApplication。 
正在安装“Microsoft.AspNet.WebApi.Core.zh-Hans 5.2.3”。 
您正在从 Microsoft 下载 Microsoft.AspNet.WebApi.Core.zh-Hans,有关此程序包的许可协议在 http://www.microsoft.com/web/webpi/eula/net_library_eula_CHS.htm 上提供。请检查此程序包是否有其他依赖项,这些依赖项可能带有各自的许可协议。您若使用程序包及依赖项,即构成您接受其许可协议。如果您不接受这些许可协议,请从您的设备中删除相关组件。 
已成功安装“Microsoft.AspNet.WebApi.Core.zh-Hans 5.2.3”。 
已成功将“Microsoft.AspNet.WebApi.Core.zh-Hans 5.2.3”添加到 ODataWebApplication。 
正在卸载“Microsoft.AspNet.WebApi.Client.zh-Hans 5.0.0”。 
已成功卸载“Microsoft.AspNet.WebApi.Client.zh-Hans 5.0.0”。 
正在卸载“Microsoft.AspNet.WebApi.Core.zh-Hans 5.0.0”。 
已成功卸载“Microsoft.AspNet.WebApi.Core.zh-Hans 5.0.0”。 
正在卸载“Microsoft.AspNet.WebApi.Client 5.0.0”。 
已成功卸载“Microsoft.AspNet.WebApi.Client 5.0.0”。 
正在卸载“Newtonsoft.Json 5.0.6”。 
已成功卸载“Newtonsoft.Json 5.0.6”。 
正在卸载“Microsoft.AspNet.WebApi.Core 5.0.0”。 
已成功卸载“Microsoft.AspNet.WebApi.Core 5.0.0”。PM>

复制代码

 

2.3,添加Model和控制器

按照  http://www.odata.org/blog/how-to-use-web-api-odata-to-build-an-odata-v4-service-without-entity-framework/ 这个链接内容的文章,添加Model和控制器,具体过程请参考原文。在本篇文章的实例中,为了更好的重用Model,我将它放到了一个独立的Demo.Models 项目中。

注意,添加控制器的时候选择空的 WebAPI 控制器,不要选择带OData 的。

OData3_20150331223628

下面是添加完整后的项目目录结构:

OData4_20150331223628

2.4,解决程序集冲突

立刻运行这个项目,发现报下面的错误:

未能加载文件或程序集“System.Web.Http, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)

此时需要在Web.config 文件中加入下面的配置内容:

复制代码

<system.web> <compilation debug="true" targetFramework="4.5"/> <httpRuntime targetFramework="4.5"/> </system.web> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Http" publicKeyToken="31BF3856AD364E35" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31BF3856AD364E35" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0"/> </dependentAssembly> </assemblyBinding> </runtime>

复制代码

也可以在编译项目的时候,注意查看“输出窗口”,单击“警告”的文字内容,会有下面的提示询问,回答确定即可自动为你添加上面的内容:

OData5_20150331225121

 

2.5,正确的OData 服务程序

再次运行,程序不报错了,用谷歌浏览器来打开本程序,出现了下面的内容,就表示ASP.NET WebAPI OData V4 已经成功了:

复制代码

{"@odata.context":"http://localhost:20491/$metadata#People","value":[{"ID":"001","Name":"Angel","Description":null},{"ID":"002","Name":"Clyde","Description":"Contrary to popular belief, Lorem Ipsum is not simply random text."},{"ID":"003","Name":"Elaine","Description":"It has roots in a piece of classical Latin literature from 45 BC, making Lorems over 2000 years old."}]
}

复制代码

 

三、添加OData客户端

3.1,添加OData 控制台程序

按照下面链接文章的内容,新建一个控制台程序:

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-client-app

3.2,为VS添加OData客户端工具

按照上面链接文章的内容,添加此工具,如下图:

OData8_20150331231126

下载好该工具后让你安装运行,最后会让你重启动VS。

3.3,添加OData客户端T4程序

重新启动后,如果看到下面的内容,表示该工具安装成功了。

OData9_20150331232041

该工具运行后,会在项目下面添加一个OData Client T4 文件,添加后,运行该项目,会报下面的错误:

错误    1    正在运行转换: System.ArgumentException: The value "" is not a valid MetadataDocumentUri because is it not a valid absolute Uri. The MetadataDocumentUri must be set to an absolute Uri referencing the $metadata endpoint of an OData service. 在 Microsoft.VisualStudio.TextTemplating0CFD4DFE54AE767D51F4D19A4964CA0B33E6E87CF53FFF790646D6E3F14916C4544A62E4C781ABB55BC19EE5225FDBA7E28D9767E56040F8F9A9EF5278D6B7CA.GeneratedTextTransformation.set_MetadataDocumentUri(String value) 位置 c:\Users\dth\Documents\Visual Studio 2013\Projects\ODataWebApplication\Demo.ConsoleClient\ODataClient1.ttinclude:行号 125 在 Microsoft.VisualStudio.TextTemplating0CFD4DFE54AE767D51F4D19A4964CA0B33E6E87CF53FFF790646D6E3F14916C4544A62E4C781ABB55BC19EE5225FDBA7E28D9767E56040F8F9A9EF5278D6B7CA.GeneratedTextTransformation.ApplyParametersFromConfigurationClass() 位置 c:\Users\dth\Documents\Visual Studio 2013\Projects\ODataWebApplication\Demo.ConsoleClient\ODataClient1.ttinclude:行号 313 在 Microsoft.VisualStudio.TextTemplating0CFD4DFE54AE767D51F4D19A4964CA0B33E6E87CF53FFF790646D6E3F14916C4544A62E4C781ABB55BC19EE5225FDBA7E28D9767E56040F8F9A9EF5278D6B7CA.GeneratedTextTransformation.TransformText() 位置 c:\Users\dth\Documents\Visual Studio 2013\Projects\ODataWebApplication\Demo.ConsoleClient\ODataClient1.ttinclude:行号 58    c:\Users\dth\Documents\Visual Studio 2013\Projects\ODataWebApplication\Demo.ConsoleClient\ODataClient1.ttinclude    125    1    Demo.ConsoleClient

3.4,配置OData Client T4 信息

根据错误信息,找到T4文件错误的位置,将前面的OData WebAPI项目的地址,写在文件里面,如下所示:

// The URI of the metadata document. The value must be set to a valid service document URI or a local file path // eg : "http://services.odata.org/V4/OData/OData.svc/", "File:///C:/Odata.edmx", or @"C:\Odata.edmx" // ### Notice ### If the OData service requires authentication for accessing the metadata document, the value of // MetadataDocumentUri has to be set to a local file path, or the client code generation process will fail. public const string MetadataDocumentUri = "http://localhost:20491/";

3.5,生成OData Client 代理类

此时再次运行该T4文件,我们发现OData Client 代理类文件生成了,内容很多,这里就不贴了。

3.6,使用OData Client 代理类

添加下面的代码,调用OData Client 代理类并运行:

复制代码

class Program { static void Main(string[] args) { // TODO: Replace with your local URI. string serviceUri = "http://localhost:20491/"; var container = new DefaultContainer(new Uri(serviceUri));foreach (var p in container.People) { Console.WriteLine("{0} {1} {2}", p.ID, p.Name, p.Description); }Console.Read(); } }

复制代码

如果看到下面的运行结果,表示OData Client 程序成功了:

OData10_20150331233137

 

至此,OData WebAPI Serivce & Client 的工作就全部完成了。

四、不使用OData客户端工具访问OData 服务

4.1,封装OData Client 类库

经过前面的过程我们看到,依托于OData 客户端工具生成OData 代理类的过程还是比较麻烦的,当然好处也有,但缺点就是没有手工操控的那么灵活自由。

仔细研究下前面的代理类,我们发现这里关键依赖于  Microsoft.OData.Client 程序集的DataServiceContext 对象,将代理类进行抽取封装就可以完成我们手工的代理类了。

创建一个类库项目,新建一个 ODataV4ContextBase.cs 文件,

OData_sln_20150401160425

接着为该项目添加Nuget 依赖的包:

Install-Package Microsoft.OData.Client

然后在项目下增加了一个文件 packages.config,里面有如下内容:

复制代码

<?xml version="1.0" encoding="utf-8"?>
<packages><package id="Microsoft.OData.Client" version="6.11.0" targetFramework="net40" /><package id="Microsoft.OData.Core" version="6.11.0" targetFramework="net40" /><package id="Microsoft.OData.Edm" version="6.11.0" targetFramework="net40" /><package id="Microsoft.Spatial" version="6.11.0" targetFramework="net40" />
</packages>

复制代码

然后,编写ODataV4ContextBase 类的具体内容:

复制代码

using Microsoft.OData.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace PWMIS.OData.Client
{/// <summary>/// OData V4 Version ASP.NET WebAPI OData RestFull Client Context/// <remarks>v1.0 2015.4.1 http://www.pwmis.com/sqlmap </remarks>/// </summary>public class ODataV4ContextBase : DataServiceContext{/// <summary>/// V4 OData Init/// </summary>/// <param name="serviceRoot">V4 OData ASP.NET WebAPI url base</param>public ODataV4ContextBase(string  serviceRoot): base(new System.Uri( serviceRoot), ODataProtocolVersion.V4){if (!serviceRoot.EndsWith("/"))serviceRoot = serviceRoot + "/";GeneratedEdmModel gem = new GeneratedEdmModel(serviceRoot);this.Format.LoadServiceModel = gem.GetEdmModel;this.Format.UseJson();}public IQueryable<T> CreateNewQuery<T>(string name) where T : class{return base.CreateQuery<T>(name);}class GeneratedEdmModel{private string ServiceRootUrl;public GeneratedEdmModel(string serviceRootUrl){this.ServiceRootUrl = serviceRootUrl;}public Microsoft.OData.Edm.IEdmModel GetEdmModel(){string metadataUrl = ServiceRootUrl + "$metadata";return LoadModelFromUrl(metadataUrl);}private Microsoft.OData.Edm.IEdmModel LoadModelFromUrl(string metadataUrl){System.Xml.XmlReader reader = CreateXmlReaderFromUrl(metadataUrl);try{return Microsoft.OData.Edm.Csdl.EdmxReader.Parse(reader);}finally{((System.IDisposable)(reader)).Dispose();}}private static System.Xml.XmlReader CreateXmlReaderFromUrl(string inputUri){return System.Xml.XmlReader.Create(inputUri);}}}
}

复制代码

4.2 编写ODataClient客户端

在解决方案里面添加一个WinForm项目,在项目里面添加一个ODataContainer.cs 文件,内容如下:

复制代码

class ODataContainer : PWMIS.OData.Client.ODataV4ContextBase{public ODataContainer(string serviceRoot):base(serviceRoot){}public IQueryable<Person> People{get{return base.CreateNewQuery<Person>("People");} }}

复制代码

非常的简单,这里只是添加了一个属性 People。

然后,在窗体代码中调用:

复制代码

private void button1_Click(object sender, EventArgs e){string serviceUri = "http://localhost:20491/";var container = new ODataContainer(serviceUri);var query = container.People.Where(p => p.Description!=null);this.dataGridView1.DataSource = query.ToList();}

复制代码

最后运行该程序,出现下面的界面,就表示成功了:

OData_Win_0150401160319

 

至此,一个不依赖于EF的全内存的OData 应用程序就完全做好了,更多OData的研究,请大家一起来做吧。

感谢支持 PDF.NET SOD框架,相关代码请在此下载。

注:本文说的 ODataV4ContextBase OData客户端基类程序已经集成到了PDF.NET框架中,在上面的下载里面即可看到。

《SOD框架“企业级”应用数据架构实战》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构 - 顺序存储二叉树(前序中序后序遍历)

就是逻辑上是二叉树&#xff0c;物理上是一个数组 需求 package tree;public class ArrayBinaryTreeDemo {public static void main(String[] args) {int arr [] {1, 2, 3, 4, 5, 6, 7};ArrayBinaryTree arrayBinaryTree new ArrayBinaryTree(arr);//arrayBinaryTree.preOrde…

【转】WCF Data Service 使用小结 (一)—— 了解OData协议

最近做了一个小项目&#xff0c;其中用到了 WCF Data Service&#xff0c;之前是叫 ADO.NET Data Service 的。关于WCF Data Service&#xff0c;博客园里的介绍并不多&#xff0c;但它确实是个很好的框架。可以很方便地通HTTP来访问数据库&#xff0c;如果你是做富客户端开发的…

数据结构 - 线索化二叉树(线索化与遍历)

!!(这里我debug很久才理解过来)** 这里8的前驱为null&#xff0c;所以8的leftType1&#xff0c;但是6是没有后继的或者说后继为null但是rightType为0(因为后继是在下一个节点来进行连接的&#xff0c;6没有下一个节点&#xff0c;所以不能实现后继的线索化&#xff0c;所以righ…

【转】WCF Data Service 使用小结(二) —— 使用WCF Data Service 创建OData服务

在 上一章 中&#xff0c;介绍了如何通过 OData 协议来访问 OData 服务提供的资源。下面来介绍如何创建一个 OData 服务。在这篇文章中&#xff0c;主要说明在.NET的环境下&#xff0c;如何使用 WCF Data Service 来创建OData服务。当然&#xff0c;对于 JAVA 或者其它平台&…

算法 - 堆排序(大顶堆、小顶堆)

用的是顺序存储二叉树&#xff0c;也就是数组实现的二叉树&#xff0c;遍历的时候按照的是二叉树的形式 代码实现 package tree;import java.util.Arrays;public class HeapSort {public static void main(String []args){int [] arr {4, 6, 8, 5, 9,-1,-1,2,4,5,6,88};heapS…

【转】WCF Odata 开放数据协议应用

OData简介 说起 WCF Data Service &#xff0c;不得不说的是 OData。对于一个标准的 Web 服务&#xff0c;它往往会提供了一些功能&#xff0c;比如说&#xff1a;订货、退货这些&#xff0c;然后使用者通过HTTP协议来使用这些功能。这是面向服务的基本思想&#xff0c;然而面…

数据结构 - 赫夫曼树

wpl最小的就是赫夫曼树(所有叶子节点的带权路径长度之和最小) 写出来两个节点连接&#xff0c;然后循环就可以了 package tree.huffmantree;import java.util.ArrayList; import java.util.Collections; import java.util.List;public class huffmanTree {public static void …

算法 - 赫夫曼编码(对字符串进行压缩 与 解压(解码)) - (对文件进行压缩解压)

1.压缩&#xff1a;使用赫夫曼编码进行压缩 题目 构建赫夫曼树 package tree.huffmantree;import java.util.*;public class HuffmanCode {public static void main(String[] args) {String content "i like like like java do you like a java";byte [] contentBy…

【转】Dynamics 365 Customer Engagement中插件的调试

微软动态CRM专家罗勇 &#xff0c;回复319或者20190319可方便获取本文&#xff0c;同时可以在第一间得到我发布的最新博文信息&#xff0c;follow me&#xff01;我的网站是 www.luoyong.me 。 本文主要根据官方的教程 Tutorial: Debug a plug-in 而写&#xff0c;使用的环境是…

数据结构 - 二叉排序树BST(创建、遍历、删除节点)

数组与链表区别&#xff1a; 二叉排序树的创建和遍历 代码实现 package tree.binarysorttree;public class BinarySortTreeDemo {public static void main(String []args){int [] arr {7,3,10,12,5,1,9};BinarySortTree binarySortTree new BinarySortTree();//循环添加节点…

【转】Dynamics 365中开发和注册插件介绍

是微软Dynamics 365 & Power Platform方面的工程师罗勇&#xff0c;也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP)&#xff0c;欢迎关注我的微信公众号 MSFTDynamics365erLuoYong &#xff0c;回复380或者201911…

数据结构- 平衡二叉树AVL树(左旋、右旋、双旋转)

第三棵树根节点的左子树高度为3右子树高度为1&#xff0c;相差为2大于1&#xff0c;所以不是平衡二叉树 //左旋转方法private void leftRotate(){//创建新的节点,以当前根节点的值Node newNode new Node(value);//把新的节点的左子树设置成当前节点的左子树newNode.left …

数据结构 - 多路搜索树(2-3树、b树、b+树、b*树)

如果二叉树的高度太高&#xff0c;速度还是比较慢 2-3树 实现步骤 数列&#xff1a;[16,24,12,32,26,34,10,8,28,38,20] 第一步&#xff1a;16直接放到一个2节点 第二步&#xff1a;24放到16后面 第三步&#xff1a;12不能放到16前面&#xff0c;要不然不满足2-3树变成4叉了…

【转】如何在 Visual Studio 2019 中连接中国版 Azure

导语 做国内项目很可能用到中国版的 Azure&#xff0c;即世纪互联运营的 azure.cn。然而 Visual Studio 2019 默认连接的是国际版的 Azure&#xff0c;如何添加中国版订阅呢&#xff1f; 差点996 6年前我曾经写过一篇《图解&#xff1a;如何在Visual Studio 2013中连接中国版…

数据结构- 图

矩阵&#xff1a;0表示不连通&#xff0c;1表示连通 图的遍历

【转】掌握Azure订阅的关键概念和术语

Azure的订阅结构可以让管理员分担结算和资源管理的责任。但首先&#xff0c;他们需要了解账户和部门等概念。 通过Microsoft企业协议&#xff0c;Azure订阅遵循分层结构来隔离用户角色和权限。围绕这些订阅的术语有时难以理解&#xff0c;特别是Azure部门和帐户相关的术语。 …

算法 - 二分查找(非递归实现二分查找)

package Algorithm.binarysearchnorecursion;public class BinaaySearchNoRecur {public static void main(String[] args) {int arr [] {1,2,3,4,5};int b binarySearch(arr, 0);System.out.println(b);}//二分查找的非递归实现public static int binarySearch(int [] arr, …

【转】Windows Azure的账户体系

Windows Azure提供了分级的账户体系&#xff0c;理解并灵活使用这种账户体系能为用户的业务提供非常切实的帮助。 不同类型的客户和账户体系 Windows Azure将客户分为两种基本类型&#xff1a;标准客户和企业协议客户。企业协议客户&#xff08;EnterpriseAgreement Customer…

算法- 分治算法(实现汉诺塔)

package Algorithm.dac;public class Hannoitower {public static void main(String []args){hannoiTower(5,A, B, C);}//汉诺塔移动方法//使用分治算法public static void hannoiTower(int num, char a, char b, char c){//如果只有一个盘if (num 1){System.out.println(&quo…

【转】关于Azure存储账户

概述 Azure 存储帐户是一个在 Azure存储服务中使您能够访问的安全帐户。您的存储帐户为您的数据&#xff0c;提供了唯一的命名空间&#xff0c;默认情况下&#xff0c;它是仅供您帐户的所有者使用的。 有两种类型的存储帐户&#xff1a; 标准存储帐户包括 Blob、表和队列存储…