DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录.
  • DmozDir.org
DMOZ目录快速登录入口-免费收录各类优秀网站的中文网站目录.由人工编辑,并提供网站分类目录检索及地区分类目录检索,是站长免费推广网站的有力平台!

建立一个实时SignalR仪表板与AngularJS

  • 建立一个实时SignalR仪表板与AngularJS

  • 已被浏览: 139 次2020年10月13日    来源:  DMOZ中文网站分类目录
  • SignalR是一个实时的WebSocket通信的库。路易Bacaj演示了如何利用其权力,建立与AngularJS服务仪表板。

    让我们建立一个实时服务中心!

    Service dashboard screenshot

    我们的服务仪表盘会显示我们实时的真实数据。它会告诉我们发生了什么我们的服务器和我们在近实时,异步非阻塞的方式微服务上。

    看看什么是完整的客户端可以像在这里。

    服务器的演示可以在这里看到。

    我们将建立一个使用AngularJS框架和许多有大量实时数据的酷实时图表,此仪表板的缩小版。我们还将建立一个使用SignalR和Web API库从.NET 4.5我们的服务。

    技术架构

    客户端

    AngularJS力巨大的应用开发实践盒子的右出。一切都在注射时,这意味着有依赖关系的低耦合。此外,角有意见,模型和控制器之间有很大距离。

    角恭维通过允许服务器端代码保持小的,可管理和可测试.NET这里。这是做繁重 - 服务器端代码只是为了它的优势利用。

    服务器

    使用SignalR使用Web API的.NET 4.5是非常类似于使用Node.js的与Socket.IO,并允许同一类型从服务器非阻塞,异步推到订阅的客户。 SignalR使用网络插座下方,而是因为它抽象了通讯,将里面的角上运行时回落到什么技术客户端浏览器的支持。 (例如,它可能会回落到长轮询旧的浏览器。)

    此外,与动态标签和Json.NET的魔力,JavaScript是像对待由.NET框架中的头等公民。事实上,它往往更容易使用Web API和SignalR技术在JavaScript中,甚至比通过本机.NET客户端,因为他们考虑使用JavaScript构建的。

    香饽饽

    获取设置

    所有在本教程中使用的AngularJS代码可以在这里找到。

    我将使用Visual Studio去了你最喜欢的文本编辑器和滑动文件夹创建此,以及为那些创建项目。

    用纯文本文件设置

    文件夹和文件结构如下所示:

    <预的tabindex = “0”>根

    应用程序(角应用特定的JavaScript)

    内容(CSS等)

    脚本(引用的JavaScript等)

    ...

    的index.html

    主要依赖

    您需要下载以下文件:

    jQuery的(选择“下载的压缩,制作的jQuery 2.1.1”链接)

    AngularJS(点击下载大选项,然后单击最新版本1.3角的。+)

    引导(点击“下载引导”选项)

    SignalR(点击右侧的“下载ZIP”按钮)

    D3.js(点击“d3.zip”链接半路下来页)

    时代(点击“下载v0.6.0链接)

    NG-时期(点击右侧的“下载ZIP”按钮)

    N3馅饼(点击右侧的“下载ZIP”按钮)

    在我们的脚本的文件夹,我们将需要:

    <代码>的jquery-2.1.1.min.js

    <代码> angular.min.js

    <代码> bootstrap.min.js

    <代码> jquery.signalR.min.js

    <代码> d3.min.js

    <代码> epoch.min.js

    <代码>饼chart.min.js

    在我们的<代码>内容文件夹中:

    <代码> bootstrap.min.css

    <代码> epoch.min.css

    与Visual Studio安装

    设置通过Visual Studio这件事是非常简单的,如果文本文件是对你来说太简单了。

    只需将设置一个空的Web应用程序的文件 - >新建 - >项目,然后选择Web作为模板类型。

    Visual Studio Angular Setup

    然后,只需右键单击该项目,选择<代码>管理的NuGet软件包,然后搜索并下载jQuery的,AngularJS,引导,D3和SignalR JavaScript客户端。

    在您下载并安装这些,你会看到他们都在脚本和内容文件夹。此外,下安装的NuGet包,你会看到以下内容:

    Downloaded Nuget Packages

    最后的NuGet不包含纪元,NG-时代和N3图表库,所以你需要手动添加。只需按照上一节中详细介绍让这些步骤。

    让我们写我们的应用程序

    现在我们准备编写一些代码。

    首先,让我们来创建基地的 index.html的文件,将容纳我们的角度JavaScript代码。

    <预的tabindex = “0” 类= “语言的标记 ”> <代码类=“ 语言的标记”?> <!DOCTYPE HTML>

    <元的charset = “UTF-8”>

    <元名称=“视口” CONTENT =“宽度=设备宽度,初始规模= 1”>

    AngularJS - SignalR - ServiceDashboard </ TITLE></p> <p><链路的rel = “样式表的” href = “内容/ bootstrap.min.css”/></p> <p><链路的rel = “样式表的” href = “内容/ epoch.min.css”/></p> <p><SCRIPT SRC = “脚本/ jQuery的1.11.0.js”> </ SCRIPT></p> <p><SCRIPT SRC = “脚本/ bootstrap.min.js”> </ SCRIPT></p> <p><SCRIPT SRC = “脚本/ jquery.signalR-2.1.2.min.js”> </ SCRIPT></p> <p><SCRIPT SRC = “脚本/ angular.min.js”> </ SCRIPT></p> <p><SCRIPT SRC = “脚本/ d3.min.js”> </ SCRIPT></p> <p><SCRIPT SRC = “脚本/ epoch.min.js”> </ SCRIPT> <SCRIPT SRC = “脚本/ NG-epoch.js”> </ SCRIPT></p> <p><SCRIPT SRC = “脚本/馅饼chart.min.js”> </ SCRIPT></p> <p><SCRIPT SRC = “应用程序/ app.js”> </ SCRIPT></p> <p><SCRIPT SRC = “应用程序/ services.js”> </ SCRIPT></p> <p><SCRIPT SRC = “应用程序/ directives.js”> </ SCRIPT></p> <p><SCRIPT SRC = “应用程序/ controllers.js”> </ SCRIPT></p> <p></ HEAD></p> <p><体NG-应用= “angularServiceDashboard”></p> <p></ BODY></p> <p></ HTML> </代码> </ PRE></p> <p>有几件事情怎么回事。我们是,首先,将所有的依赖关系,使他们加载。其次,我们参照了还不存在一些新的文件(在所有的应用程序文件夹中的文件)。我们会写那些未来。</p> <p>让我们去到我们的应用程序文件夹,并创造我们的<code> app.js </ code>文件。这是一个非常简单的文件。</p> <p><预的tabindex = “0” 类= “语言的javascript ”> <代码类=“ 语言的javascript”> "使用严格";</p> <p>VAR应用= angular.module( "angularServiceDashboard",[ "ng.epoch", "N3-饼图"]);</p> <p>app.value( "backendServerUrl", "http://sitepointsignal.cloudapp.net/"); </代码> </ PRE></p> <p>这个文件做了几件事情对我们来说。它设置了我们的主应用程序模块<代码> angularServiceDashboard </代码>和在我们的外部引用两个内喷射 - <代码> ng.epoch </代码>,这是我们Epoch.js指令折角,并且<代码> N3-饼图</代码>,它是用于角制成的图表库,并且适当的结构。</p> <p>如果您发现,我们也注入在为<代码>的值backendServerUrl </ code>的,这当然是托管在其他地方,而我们打算在这里消费。</p> <p>让我们创建将绑定到服务器的URL服务工厂类。这将是我们的<code> services.js </ code>文件我们在HTML中引用,它会进入app文件夹:</p> <p><预的tabindex = “0” 类= “语言的javascript ”> <代码类=“ 语言的javascript”> "使用严格";</p> <p>app.factory( "backendHubProxy",[ "$ rootScope", "backendServerUrl",</p> <p>功能($ rootScope,backendServerUrl){</p> <p>功能backendFactory(的serverUrl,hubName){</p> <p>VAR连接= $ .hubConnection(backendServerUrl);</p> <p>VAR =代理connection.createHubProxy(hubName);</p> <p>connection.start()来完成(函数(){})。</p> <p>返回{</p> <p>于:功能(eventName的,回调){</p> <p>proxy.on(eventName的,功能(结果){</p> <p>$ rootScope。$应用(函数(){</p> <p>如果(回调){</p> <p>回调(结果);</p> <p>}</p> <p>});</p> <p>});</p> <p>},</p> <p>调用:功能(方法名,回调){</p> <p>proxy.invoke(方式)</p> <p>.done(函数(结果){</p> <p>$ rootScope。$应用(函数(){</p> <p>如果(回调){</p> <p>回调(结果);</p> <p>}</p> <p>});</p> <p>});</p> <p>}</p> <p>};</p> <p>};</p> <p>返回backendFactory;</p> <p>}]); </代码> </ PRE></p> <p>这段代码采用了流行的<code>在</ code>和<代码>关闭</代码>(没有关闭,因为我们并不需要在这里)订阅模式,封装了所有与SignalR通信为我们通过使用角工厂应用。</p> <p>此代码可能乍一看有点势不可挡,但你会更好地理解它,当我们建立我们的控制器。它所做的就是参加我们的后端SignalR服务器的URL和SignalR枢纽名。 (在SignalR可以在同一服务器推送数据使用多个集线器)。</p> <p>此外,该代码允许SignalR服务器,这是坐在另一个盒子的地方,通过<码>拨打我们的应用程序上</ code>方法。它允许我们的应用程序来调用函数的SignalR服务器的内部通过<代码>调用</ code>方法。</p> <p>接下来,我们需要我们的控制器,将从服务为我们的范围绑定我们的数据。让我们创建一个在我们的应用程序文件夹名为<code> controllers.js </ code>文件。</p> <p><预的tabindex = “0” 类= “语言的javascript ”> <代码类=“ 语言的javascript”> "使用严格";</p> <p>app.controller( "PerformanceDataController",[ "$范围", "backendHubProxy",</p> <p>功能($范围,backendHubProxy){</p> <p>的console.log(“试图连接到服务”)</p> <p>VAR performanceDataHub = backendHubProxy(backendHubProxy.defaultServer, "performanceHub");</p> <p>的console.log(“连接到服务”)</p> <p>$ scope.currentRamNumber = 68;</p> <p>performanceDataHub.on( "broadcastPerformance",函数(数据){</p> <p>data.forEach(函数(的DataItem){</p> <p>开关(dataItem.categoryName){</p> <p>情况下“处理器”:</p> <p>打破;</p> <p>情况下“记忆”:</p> <p>$ scope.currentRamNumber = dataItem.value;</p> <p>打破;</p> <p>情况下,“网络中”:</p> <p>打破;</p> <p>情况下,“网络外”:</p> <p>打破;</p> <p>案“磁盘读取字节/秒”:</p> <p>打破;</p> <p>案“磁盘写入字节/秒”:</p> <p>打破;</p> <p>默认:</p> <p>//默认代码块</p> <p>打破;</p> <p>}</p> <p>});</p> <p>});</p> <p>}</p> <p>]); </代码> </ PRE></p> <p>该控制器做了几件事情在这里。它创造了我们的角度服务对象并绑定一个回调函数它,这样服务器在我们的控制器东西通话。</p> <p>你会看到,我们是通过服务器每次调用我们回到时间返回的JSON数组循环。然后,我们对每场演出类型的switch语句。现在,我们将设置RAM和回来,充实休息。</p> <p>至于我们的指令而言,我们只需要一个对我们这个时代的图表。我们将使用名为<code> NG-epoch.js </ code>的一个开放源代码的指令,我们已经在我们的存根有一个参考的<code> index.html的</代码> file.We可能分裂的所有这些图表为不同的指令,使用一些模板和使用UI的路由器,但是我们在这里让事情变得简单和转储所有我们的观点在我们的<code> index.html的</ code>文件。</p> <p>让我们添加视图的<code> index.html的</ code>文件了。我们可以通过添加下body标签下面这样:</p> <p><预的tabindex = “0” 类= “语言的标记 ”> <代码类=“ 语言的标记 ”> <DIV类=“ 行” NG-控制器= “PerformanceDataController”></p> <p><DIV类= “COL-LG-3 COL-MD-6”></p> <p><DIV类=“面板面板的仪表板”></p> <p><DIV类= “中心”>记忆效果</ DIV></p> <p><DIV类=“面板体”></p> <p><DIV类= “庞大”> {{currentRamNumber}} </ DIV></p> <p><DIV类= “clearfix”> </ DIV></p> <p></ DIV></p> <p></ DIV></p> <p></ DIV></p> <p></ DIV></p> <p></ DIV> </代码> </ PRE></p> <p>这将只需创建一个地方的服务器推回RAM中的数据。数据将首先对我们的服务,然后到控制器,然后终于到了看法。</p> <p>它应该是这个样子:</p> <p>现在,让我们添加一些图表,这是我们真正想做的事情。我们将添加一个名为<code>时间戳</代码>变量的<代码> epoch.js </代码>时间轴。我们还将添加一个名为<代码>数组chartEntry </ code>的,我们将结合我们的<代码> epoch.ng </ code>的指令。</p> <p><预的tabindex = “0” 类= “语言的javascript ”> <代码类=“ 语言的javascript”> VAR时间戳=((新日期())的getTime()/ 1000。)| 0;</p> <img src="https://uploads.sitepoint.com/wp-content/uploads/2015/03/1426599726PrimitivePerformanceNumber.png" alt="Performance Number pushed by the server" width="403" height="86" class="alignnone size-full wp-image-101593" loading="lazy"> <p>VAR chartEntry = []; </代码> </ PRE></p> <p>然后让我们在<码>开关</ code>语句的数据映射,并添加所需的<code> epoch.js </ code>的数据项的其余部分。我们当然可以,进一步打破了这一点(比如使用一些更多的功能和过滤器),但我们会保持简单的教程的缘故。</p> <p><预的tabindex = “0” 类= “语言的javascript ”> <代码类=“ 语言的javascript”> "使用严格";</p> <p>app.controller( "PerformanceDataController",[ "$范围", "backendHubProxy",</p> <p>功能($范围,backendHubProxy){</p> <p>...</p> <p>$ scope.currentRamNumber = 68;</p> <p>$ scope.realtimeArea = [{标号: "层1",值:[]}];</p> <p>performanceDataHub.on( "broadcastPerformance",函数(数据){</p> <p>VAR时间戳=((新的Date())的getTime()/ 1000)| 0;</p> <p>VAR chartEntry = [];</p> <p>data.forEach(函数(的DataItem){</p> <p>开关(dataItem.categoryName){</p> <p>情况下“处理器”:</p> <p>$ scope.cpuData = dataItem.value;</p> <p>chartEntry.push({时间:时间戳,Y:dataItem.value});</p> <p>执行console.log(chartEntry)</p> <p>打破;</p> <p>情况下“记忆”:</p> <p>$ scope.currentRamNumber = dataItem.value;</p> <p>打破;</p> <p>情况下,“网络中”:</p> <p>打破;</p> <p>情况下,“网络外”:</p> <p>打破;</p> <p>案“磁盘读取字节/秒”:</p> <p>打破;</p> <p>案“磁盘写入字节/秒”:</p> <p>打破;</p> <p>默认:</p> <p>//默认代码块</p> <p>打破;</p> <p>}</p> <p>});</p> <p>$ scope.realtimeAreaFeed = chartEntry;</p> <p>});</p> <p>$ scope.areaAxes = [ "左", "右", "底部"];</p> <p>}</p> <p>]); </代码> </ PRE></p> <p>我们的控制器看起来更有点充实。我们增加了一个<代码> realtimeAreaFeed </代码>的范围内,我们将通过<代码> NG-时代</ code>的指令绑定到我们的观点,我们也增加了<代码> areaAxes </代码>到的范围,其决定了面积图的布局。</p> <p>现在,让我们的指令添加到<代码>的index.html </代码>并显示在用于CPU的值来的数据:</p> <p><预的tabindex = “0” 类= “语言的标记 ”> <代码类=“ 语言的标记 ”> <DIV类=“ 行” NG-控制器= “PerformanceDataController”></p> <p><DIV类= “面板体” NG控制器= “PerformanceDataController”></p> <p><划时代活区域图表级=“category10”</p> <p>图表高度=“200”</p> <p>图表数据=“realtimeArea”</p> <p>图表流=“realtimeAreaFeed”</p> <p>图表轴=“areaAxes”></p> <p></划时代活区域></p> <p></ DIV></p> <p></ DIV> </代码> </ PRE></p> <p><代码>图表级</代码>指D3.js,<代码>图表高度</代码>的着色方案是怀疑什么,和<code>图表流</代码>是数据来从SignalR服务器返回。</p> <p>随着到位,我们应该看到,在图表中实时遇到:</p> <p>现在,让我们一大堆的数据点连线到这个图表,从N3馅饼框架添加完全是另外一个图表(因为谁不爱呢馅饼!)。</p> <p>从N3馅饼框架添加饼图,只需将下列内容添加到我们的控制器:</p> <img src="https://uploads.sitepoint.com/wp-content/uploads/2015/03/1426600085FirstChart.png" alt="First chart coming across" width="506" height="335" class="alignnone size-full wp-image-101596" loading="lazy"> <p><预的tabindex = “0” 类= “语言的javascript ”> <代码类=“ 语言的javascript”> $ scope.data = [</p> <p>{标号: "CPU",值:78,颜色: "#d62728",后缀: "%"}</p> <p>]; </代码> </ PRE></p> <p>在<code>值</代码>当然,将由SignalR服务器更新。您可以在我们的控制器完整的代码看到这一点。</p> <p>我们还应该花一点时间来考虑我们的观点的全部代码。</p> <p>我们应该看到屏幕上的以下数据:</p> <p>我们已经看到,角度可以线长达SignalR极易 - 通过在一个AngularJS服务或工厂终点简单地插入。所述AngularJS工厂是一种封装机制SignalR进行通信。谁知道,AngularJS和.NET会工作这么好在一起的时候“结婚了?”服务器的核心环节</p> <p>我将在一个位的.NET代码,允许该通信在后端发生的。 (你可以在这里找到源代码。)</p> <img src="https://uploads.sitepoint.com/wp-content/uploads/2015/03/1426600265SecondChart.png" alt="Memory Performance 1397, CPU Performance 23%" width="803" height="350" class="alignnone size-full wp-image-101598" loading="lazy"> <p>要开始使用首先构建服务器代码,你需要得到SignalR在Visual Studio解决方案运行。要做到这一点,只需按照伟大的教程在上ASP.NET得到基本解决SignalR运行。 (这是最简单的一种。)</p> <h2>一旦你的启动和运行,改变C#<代码>集线器</ code>类以下几点:</h2> <p><预的tabindex = “0” 类= “语言CSHARP ”> <代码类=“ 语言CSHARP”>公共类PerformanceHub:集线器</p> <p>{</p> <p>公共无效SendPerformance(IList的<PerformanceModel> performanceModels)</p> <p>{</p> <p>Clients.All.broadcastPerformance(performanceModels);</p> <p>}</p> <p>公共无效心跳()</p> <p>{</p> <p>Clients.All.heartbeat();</p> <p>}</p> <p>公众覆盖任务OnConnected()</p> <p>{</p> <p>返回(base.OnConnected());</p> <p>}</p> <p>} </代码> </ PRE></p> <p>一旦你改变了<代码>集线器</ code>类,Visual Studio会抱怨,你将需要添加一个性能模型(因为它是由服务器推出,这是自动转换为JSON,多亏了Json.NET):</p> <p><预的tabindex = “0” 类= “语言CSHARP ”> <代码类=“ 语言CSHARP”>使用系统;</p> <p>使用System.Collections.Generic;</p> <p>使用System.Linq的;</p> <p>使用的System.Web;</p> <p>使用Newtonsoft.Json;</p> <p>命名空间SignalrWebService.Models</p> <p>{</p> <p>公共类PerformanceModel</p> <p>{</p> <p>[JsonProperty( “计算机名”)]</p> <p>公共字符串计算机名{获得;组; }</p> <p>[JsonProperty( “类别名称”)]</p> <p>公共字符串类别名称{获得;组; }</p> <p>[JsonProperty( “counterName”)]</p> <p>公共字符串CounterName {获得;组; }</p> <p>[JsonProperty( “实例名”)]</p> <p>公共字符串实例名{获得;组; }</p> <p>[JsonProperty( “值”)]</p> <p>公共double值{获得;组; }</p> <p>}</p> <p>} </代码> </ PRE></p> <p>在<code> JsonProperty </代码>元数据被简单地告诉Json.NET自动转换属性名称转换为JSON这个模型时为小写。 JavaScript的喜欢小写。</p> <p>让我们添加一个<代码> PerformanceEngine </ code>类,这推给任何人,将用实际的性能数据倾听。该发动机将通过SignalR这些消息给任何监听客户端上的异步后台线程。</p> <p>由于它的长度,你可以找到我们的GitHub库的代码。</p> <p>此代码基本上推动性能度量的阵列出到在每个<代码>订阅任何人而</代码>迭代。这些性能指标被注入到构造函数。从服务器推送的速度设定在构造参数<代码> pollIntervalMillis </代码>。</p> <p>注意,这将正常工作,如果你使用OWIN作为自主机托管SignalR,它应该,如果您使用的是网络工作者做工精细。</p> <p>做的最后一件事,当然是开始在服务<代码>的OnStart()</ code>的或在您的<code>启动</ code>类的后台线程的地方。</p> <p><预的tabindex = “0” 类= “语言CSHARP ”> <代码类=“ 语言CSHARP”>使用系统;</p> <p>使用System.Collections.Generic;</p> <p>使用System.Linq的;</p> <p>使用的System.Web;</p> <p>使用Owin;</p> <p>使用System.Threading.Tasks;</p> <p>使用Microsoft.Owin;</p> <p>使用SignalrWebService.Performance;</p> <p>使用Microsoft.Owin.Cors;</p> <p>使用Microsoft.AspNet.SignalR;</p> <p>使用SignalrWebService.Models;</p> <p>[组件:OwinStartup(typeof运算(SignalrWebService.Startup))]</p> <p>命名空间SignalrWebService</p> <p>{</p> <p>公共类启动</p> <p>{</p> <p>公共无效配置(IAppBuilder APP)</p> <p>{</p> <p>app.UseCors(CorsOptions.AllowAll);</p> <p>VAR = hubConfiguration新HubConfiguration();</p> <p>hubConfiguration.EnableDetailedErrors = TRUE;</p> <p>app.MapSignalR(hubConfiguration);</p> <p>PerformanceEngine performanceEngine =新PerformanceEngine(800,GetRequiredPerformanceMonitors());</p> <p>Task.Factory.StartNew(异步()=> AWAIT performanceEngine.OnPerformanceMonitor());</p> <p>}</p> <p>}</p> <p>} </代码> </ PRE></p> <p>即开始在后台线程监控(我敢肯定你已经猜到)的两行是那些我们实例化<代码> PerformanceEngine </ code>,然后,我们调用<代码> OnPerformanceMonitor()</代码>。</p> <p>现在,我知道你可能会想,我是从随机化服务器的数据,这是真的。但推真正的指标,简单地使用<code> System.Diagnostics程序</代码>库和<代码>的PerformanceCounter </ code>的Windows所提供。我想保持这种简单的,但这里是该代码是什么样子:</p> <p><预的tabindex = “0” 类= “语言CSHARP ”> <代码类=“ 语言CSHARP”>公共静态只读的IEnumerable <的PerformanceCounter> ServiceCounters =新[]</p> <p>{</p> <p>//http://weblogs.thinktecture.com/ingo/2004/06/getting-the-current-process-your-own-cpu-usage.html</p> <p>新的PerformanceCounter( “处理器信息”, “%处理器时间”, “_Total”),</p> <p>新的PerformanceCounter( “存储器”, “可用的兆字节”),</p> <p>新的PerformanceCounter( “过程”, “%处理器时间”,GetCurrentProcessInstanceName(),真),新的PerformanceCounter( “过程”, “工作组”,GetCurrentProcessInstanceName(),真)</p> <p>}; </代码> </ PRE></p> <p>结论</p> <p>我们已经看到了如何通过角消费SignalR数据,我们已经迷上数据高达实时对角端图表框架。</p> <p>在客户端的最终版本的演示可以看到这里,你可以从这里得到的代码。</p> <p>的服务器的最终版本的演示可以看到这里,你可以从这里得到的代码。</p> <h2>我希望你喜欢这个步行通过。如果你已经尝试过类似的事情,告诉我们在评论!</h2> <img src="https://uploads.sitepoint.com/wp-content/uploads/2015/03/1426600851AngularClient2-1024x502.png" alt="Demo Client Running" width="1024" height="502" class="alignnone size-large wp-image-101602" loading="lazy"> <img src="https://uploads.sitepoint.com/wp-content/uploads/2015/03/1426600957TheServer.png" alt="SignalR/Web API 2.0 service" width="859" height="815" class="alignnone size-full wp-image-101603" loading="lazy"> <br><font color=#ff0000>以上信息来源于网络,如有侵权,请联系站长删除。</font> <p><strong>TAG:</strong><a href="https://www.dmozdir.org/News/?NewsTag=%E6%9E%84%E5%BB%BA" target="_blank">构建</a> <a href="https://www.dmozdir.org/News/?NewsTag=%E7%9C%9F%E6%AD%A3%E7%9A%84" target="_blank">真正的</a> </p></li> <li class="prearticle"><strong>上一篇:</strong><a href="?CID=27808">降价处理的红宝石</a></li> <li class="nextarticle"><strong>下一篇:</strong><a href="?CID=27810">在我们的雷达:入门,干净的代码下一步维基百科</a></li> <li class="relatedNews">与“建立一个实时SignalR仪表板与AngularJS”相关的资讯</li> <li class="relatedList"><a href="?CID=56877" target="_blank" title="使用电子伪造和反应构建一个安全的桌面应用程序">使用电子伪造和反应构建一个安全的桌面应用程序</a></li> <li class="relatedList"><a href="?CID=56604" target="_blank" title="如何使用LinkedIn故事构建您的品牌:7个想法和提示">如何使用LinkedIn故事构建您的品牌:7个想法和提示</a></li> <li class="relatedList"><a href="?CID=46459" target="_blank" title="7个步骤如何构建2021个数字营销策略">7个步骤如何构建2021个数字营销策略</a></li> <li class="relatedList"><a href="?CID=36813" target="_blank" title="最简单的方式建立品牌知名度今天 - 数字营销博客">最简单的方式建立品牌知名度今天 - 数字营销博客</a></li> <li class="relatedList"><a href="?CID=30881" target="_blank" title="MEAN堆栈:开发应用与角度和角CLI">MEAN堆栈:开发应用与角度和角CLI</a></li> </ul> </div> </div> </div> <div id="sidebar"> <div class="conBox"> <h3> <span class="moreLink"><a href="../User/UserSponsored.asp" class="red">我也要出现在这里</a> | <a href="https://www.dmozdir.org/Commend.asp">更多</a></span> <strong>最新推荐</strong> </h3> <ul class="weblist"><li><div class="img-preview"><a href="https://www.dmozdir.org/SiteInformation/?www.chuchenhb.com-----60145-----.shtml"><img src="../UploadImage/month-10-11/qy4q8k20201011204216.jpg" alt="河北富宇环保设备有限公司 Powered by DMOZ中文网站分类目录 DmozDir.org" /></a></div> <div class='content'><h4><a href="http://www.chuchenhb.com" target="_blank">河北富宇环保设备有限公司</a></h4> <p>河北富宇环保设备有限公司是专业从事UV光氧,VOC催化燃烧设备,布袋除尘器,小型除尘器,脉冲除尘器,单机除尘器,旋风除尘器,湿式除尘器及除尘器骨架,除尘器布袋,电磁脉冲阀,脉冲控制仪,星型卸料器等。</p> <address>www.chuchenhb.com</address> </div></li> <li><div class="img-preview"><a href="https://www.dmozdir.org/SiteInformation/?www.bthbchuchen.com-----48683-----.shtml"><img src="../UploadImage/month-01-24/834qi120180124205918.jpg" alt="河北富宇环保设备有限公司 Powered by DMOZ中文网站分类目录 DmozDir.org" /></a></div> <div class='content'><h4><a href="http://www.bthbchuchen.com" target="_blank">河北富宇环保设备有限公司</a></h4> <p>河北富宇环保设备有限公司生产各种规格石料厂除尘器、白灰窑除尘器、仓顶布袋除尘器、脉冲单机除尘器、除尘器袋笼、除尘布袋、电晕线、卸料器、减速机、电磁阀、膜片等各种除尘器配套产品。</p> <address>www.bthbchuchen.com</address> </div></li> </ul> </div> <div class="conBox"> <h3> <span class="moreLink"><a href="https://www.dmozdir.org/Goin.asp">更多>>></a></span> <strong>入站排行</strong> </h3> <ol class="weblist" id="nwebGoin"> <li><h4><a href="https://www.dmozdir.org/SiteInformation/?www.guannews.com-----42340-----.shtml" target='_blank'>莞讯网</a></h4> <p>莞讯网立足互联网服务东莞市民,将有高价值“新闻”及时有效地传播给东莞人民。</p> <address>www.guannews.com</address> </li> <li><h4><a href="https://www.dmozdir.org/SiteInformation/?www.solizhi.com-----47774-----.shtml" target='_blank'>搜励志网</a></h4> <p>搜励志网为您提供励志文章,励志名言,励志段子,名人故事,励志签名,励志视频,励志音乐,励志视频,励志演讲,励志书籍等励志类文字信息分享网站。</p> <address>www.guannews.com</address> </li> <li><h4><a href="https://www.dmozdir.org/SiteInformation/?www.cteo.com.cn-----9777-----.shtml" target='_blank'>城经网</a></h4> <p>城经网(www.cteo.com.cn)是继报纸、电台、电视台后的第四媒体,是中国成长最快的区域性中心城市门户网之一。集中了优秀的媒介平台,将资讯和在线服务垂直触及到普通民众,享有信息共享.</p> <address>www.guannews.com</address> </li> <li><h4><a href="https://www.dmozdir.org/SiteInformation/?www.wpyou.com-----31939-----.shtml" target='_blank'>WordPress企业主题模版 - WPYOU.com</a></h4> <p>提供WordPress企业主题,WordPress外贸主题,WordPress企业模版,WordPress企业主题下载,WordPress企业建站,WordPress CMS门户主题开发</p> <address>www.guannews.com</address> </li> <li><h4><a href="https://www.dmozdir.org/SiteInformation/?www.60510862.com-----44661-----.shtml" target='_blank'>富士变频器</a></h4> <p>富士变频器中国区销售公司是一家集富士变频器,维修富士变频器的企业,能为客户提供迅捷,优质的富士变频器维修和富士变频器保养。 主要服务有富士变频器,富士变频器报价,富士变频器代理销售等</p> <address>www.guannews.com</address> </li> </ol> </div> <div class="conBox"> <h3><strong>WEB建站资讯</strong></h3> <ol class="weblist" id="nNewsList"> <li><a href="https://www.dmozdir.org/News/?CID=28473" target="_blank">建设有GRAV,现代平面文件CMS网站速度更快</a></li><li><a href="https://www.dmozdir.org/News/?CID=42687" target="_blank">Vue3教程:Vue 3.x 快在哪里?</a></li><li><a href="https://www.dmozdir.org/News/?CID=17738" target="_blank">Linux系统编程 —线程属性</a></li><li><a href="https://www.dmozdir.org/News/?CID=44123" target="_blank">Java Web之过滤器(Filter)</a></li><li><a href="https://www.dmozdir.org/News/?CID=15727" target="_blank">最新阿里蚂蚁金服四面(已拿offer)Java技术面经总结</a></li><li><a href="https://www.dmozdir.org/News/?CID=18804" target="_blank">建立你自己的柜台窗口小部件使用JavaScript和HTML</a></li><li><a href="https://www.dmozdir.org/News/?CID=31108" target="_blank">Hudi on Flink在顺丰的实践应用</a></li><li><a href="https://www.dmozdir.org/News/?CID=56475" target="_blank">Google产品评论更新已完成推出</a></li><li><a href="https://www.dmozdir.org/News/?CID=52561" target="_blank">血亏 1.5 亿、华为断供、Linux 之父怒删代码,2020 IT 大事记盘点</a></li><li><a href="https://www.dmozdir.org/News/?CID=54418" target="_blank">ElasticSearch 分词器</a></li> </ol> </div> </div> </div> <script>document.getElementById("sidebar").style.height=document.getElementById("mainInner").offsetHeight+"px";</script> <!--s=footer--> <div id="footer"> <div class="footnav"> <ul> <li><a href="https://www.dmozdir.org/">网站首页</a></li> <li><a href="https://www.dmozdir.org/About/">关于我们</a></li> <li><a href="https://www.dmozdir.org/User/UserHelp.asp">帮助中心</a></li> <li><a href="https://www.dmozdir.org/User/UserSponsored.asp">广告赞助</a></li> <li><a href="https://www.dmozdir.org/New.asp">最新加入</a></li> <li><a href="https://www.dmozdir.org/News/">建站资讯</a></li> <li><a href="https://www.dmozdir.org/Fastsubmit.asp">快速提交</a></li> <li><a href="#top">返回顶部</a></li> </ul> </div> <p>Copyright © 2006-2020 <span><a href="https://www.dmozdir.org/"><strong>DmozDir</strong></a></span> <strong>dmozdir<font color="#cc0000">.org</font></strong> All Rights Reserved. <p class="red"><span>网站免费登录,新收录网站首页显示,所有排名全自动实时刷更新,网站推广的最佳选择就在<strong>DMOZ中文网站分类目录</strong></span></p> <p>Powered By <strong><a href="https://www.dmozdir.org/" target="_blank">DMOZ中文网站分类目录</a></strong> <a target="_blank" href="https://beian.miit.gov.cn/">冀ICP备08100951号-9</a> </div> <!--e=footer--> </div> <script> (function(){ var src = "https://jspassport.ssl.qhimg.com/11.0.1.js?d182b3f28525f2db83acfaaf6e696dba"; document.write('<script src="' + src + '" id="sozz"><\/script>'); })(); </script> </body> </html>