17、云服务远程连接、配置变更检测与Web API开发指南

云服务远程连接、配置变更检测与Web API开发指南

1. 远程桌面连接

云服务运行在专用虚拟机上,可进行远程桌面连接以执行高级诊断和配置。不过,手动修改环境通常不是最佳做法,因为在扩展或升级来宾操作系统时,这些修改不会应用到新创建的角色。建议使用启动任务来实现环境自定义。

1.1 下载远程桌面协议(RDP)文件

在门户中点击实例,若“CONNECT”按钮可用,选择要连接的环境和实例,点击该按钮即可下载 .rdp 文件。打开该文件,可看到云服务端点和连接实例的相关信息:

full address:s:80c247175c3b4ea9ad4e002bb0a5cb8a.cloudapp.net
username:s:geoff
LoadBalanceInfo:s:Cookie:  
  mstshash=OrderProcessorRole#OrderProcessorRole_IN_0

云服务位于内部网络,无法直接连接。“full address”是负载均衡端点的 DNS 名称,“LoadBalanceInfo”告知负载均衡器要连接的角色和实例。

1.2 建立 RDP 连接

通过 Visual Studio Server Explorer 窗口建立 RDP 连接的步骤如下:
1. 选择角色实例,右键点击并选择“Connect using Remote Desktop…”。
2. 出现“Remote Desktop Connection”对话框。
3. 点击“Connect”,接受不受信任发布者警告。
4. 再次点击“Connect”,出现登录提示。若有使用域账户的选项,点击“Use another account”,输入发布时配置的本地账户凭据。
5. 点击“OK”,接受下一个警告,即可连接到实例并看到虚拟服务器桌面。

1.3 防火墙问题

若连接出现问题,可能是防火墙阻止了默认的 RDP 端口 3389,尤其是在企业环境中。若无法访问个人或站点防火墙,需联系网络管理员打开该端口,并可能需要提供虚拟机的 IP 地址,该地址可在云服务仪表板的快速查看部分找到。

2. 代码中检测配置更改

在角色中使用配置设置时,可在门户的角色“CONFIGURATION”选项卡中实时更改这些设置。为在代码中检测配置更改,可附加事件处理程序到 RoleEnvironment.Changing RoleEnvironment.Changed 事件:

public override bool OnStart()
{
    Trace.TraceInformation("OrderProcessorRole.WorkerRole.OnStart  - Begin");
    RoleEnvironment.Changing += RoleEnvironment_Changing;
    RoleEnvironment.Changed += RoleEnvironment_Changed;
}

private void RoleEnvironment_Changing(object sender, RoleEnvironmentChangingEventArgs e)
{
    if ((e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)))
    {
        e.Cancel = true;
    }  
}

private void RoleEnvironment_Changed(object sender, RoleEnvironmentChangedEventArgs e)
{
    if ((e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)))
    {
        this._batchQueueProcessor.Stop();
        this._stockQueueProcessor.Stop();
        this._batchQueueProcessor = new BatchQueueProcessor();
        this._stockQueueProcessor = new StockQueueProcessor();
    }
}

RoleEnvironment.Changing 事件可设置 e.Cancel true 使角色回收,新设置在下次启动时应用; RoleEnvironment.Changed 事件可处理配置更改。

3. 启动任务

启动任务是可添加到 ServiceDefinition.csdef 文件中角色的命令行脚本,能让角色在启动前执行活动,如安装第三方包或进行环境、配置更改。

3.1 创建批处理脚本

创建一个名为 DemoTasks.cmd 的 .cmd 批处理脚本,放在名为 Tasks 的解决方案文件夹中。设置文件的“Build Action”属性为“Content”,“Copy to Output Directory”为“Copy if newer”。脚本示例如下:

REM Demo Start-up Tasks to log the start-up date and time
REM Output variable
SET OutputFile="%TEMP%\StartupLog.txt"

ECHO DemoTask.cmd: >> %OutputFile% 2>&1
ECHO Current date and time: >> %OutputFile% 2>&1
DATE /T >> %OutputFile% 2>&1
TIME /T >> %OutputFile% 2>&1
REM Error block 
IF ERRORLEVEL EQU 0 (
   REM   No errors occurred. Exit cleanly with /B 0
   EXIT /B 0
) ELSE (
   REM   Log error
   ECHO Error - ERRORLEVEL = %ERRORLEVEL%.  >> %OutputFile% 2>&1
   EXIT %ERRORLEVEL%
)

3.2 添加任务

将任务添加到 csdef 文件:

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="OrderProcessor"  
  xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"  
    schemaVersion="2014-01.2.3">
  <WorkerRole name="OrderProcessorRole" vmsize="Small">
    <Startup>
      <Task commandLine="Tasks\DemoTask.cmd"  
        executionContext="limited" taskType="simple" />
    </Startup>
  </WorkerRole>
</ServiceDefinition>

可设置的属性及说明如下:
| 属性 | 说明 | 选项 |
| ---- | ---- | ---- |
| commandLine | 要执行的命令 | 可使用 .cmd 批处理文件或内联批处理命令 |
| executionContext | 脚本执行的权限 | limited(正常权限)、elevated(管理员权限) |
| taskType | 任务类型 | simple(同步运行,若以非零错误代码结束,角色将不启动)、foreground(异步运行,角色在所有任务以非零错误代码完成后启动)、background(异步运行,角色在任务未完成时启动) |

3.3 环境变量

除使用内置的 %TEMP% 环境变量外,还可在 csdef 文件的 Task 文件夹中添加自定义环境变量:

<Task commandLine="Tasks\DemoTask.cmd" executionContext="limited" taskType="simple">
  <Environment>
    <Variable name="Simple" value="Hello startup task!" />
    <Variable name="ComputeEmulatorRunning">
      <RoleInstanceValue  
        xpath="/RoleEnvironment/Deployment/@emulated" />
    </Variable>
  </Environment>
</Task>

在脚本中使用这些变量的示例:

REM Test Simple environment variable works
ECHO Simple Environment Variable: %Simple% >> %OutputFile% 2>&1
REM Check if we're in the emulator
IF "%ComputeEmulatorRunning%" == "true" (
  ECHO Running in emulator >> %OutputFile% 2>&1
) ELSE (
    ECHO Running in Azure cloud >> %OutputFile% 2>&1
)

4. Web API 与 SignalR 简介

4.1 Web API 简介

Web API 是用于构建 RESTful HTTP 网络服务的 ASP.NET 框架,适用于多种客户端应用。与其他网络服务技术(如 WCF)相比,它实现简单。以客户端应用从 SQL Server 数据库获取数据为例,直接访问数据库存在安全和配置问题,而使用 Web API 可选择任意身份验证方法,增强安全性。

4.2 SignalR 简介

SignalR 是帮助 .NET 开发者构建实时 Web 连接应用的库,利用 WebSockets 实现双向通信,减少客户端对服务器的轮询。在负载均衡的 Web 服务器上部署时,SignalR 存在可扩展性问题,可使用以下三种背板解决方案:
- Microsoft Azure Service Bus:通过冗余主题实现集线器实例间的消息传递。
- Redis:基于内存的发布/订阅模式解决方案,集线器实例可直接相互更新。
- SQL Server:通过 SQL 数据库表更新集线器实例,可选择使用服务代理。

5. 构建 Web API 服务

5.1 创建 Web API 项目

在 Visual Studio 中创建 Web API 项目并配置 Azure AD 身份验证的步骤如下:
1. 向解决方案中添加新的 Web 项目,选择 Web API 模板,确保勾选“Host in the cloud”。
2. 点击“Change Authentication”,选择“Organizational Accounts”,填写 Azure AD 域字段,点击“OK”。
3. 使用新的 AD 用户登录,在之前的对话框中点击“OK”(提示登录 Azure 时,注意将用户更改为 Azure 门户账户)。
4. 输入站点名称,选择区域和数据库服务器(选择“无数据库”,因为使用现有数据库)。
5. 点击“OK”,将配置网站、设置 AD 应用程序并创建 Web API 项目。在门户的 AD 工作区的“APPLICATIONS”选项卡中可看到应用程序已添加到列表。
6. 查看 App_Start/Startup.Auth.cs 类,可看到使用 IAppBuilder 接口实现 AD 身份验证的代码:

public void ConfigureAuth(IAppBuilder app)
{
    app.UseWindowsAzureActiveDirectoryBearerAuthentication(
        new WindowsAzureActiveDirectoryBearerAuthenticationOptions
        {
            Audience = ConfigurationManager.AppSettings["ida:Audience"],
            Tenant = ConfigurationManager.AppSettings["ida:Tenant"]
        });
}
  1. 可在本地测试项目,运行时可能会因本地 Web 服务器实现临时 SSL 证书而出现安全警告。
  2. 接受警告后,可看到 Web API 的主页。默认情况下,Web API 主页无需授权,可通过在 HomeController 中添加 Authorization 属性更改此设置。
  3. 导航到 api/values URL,会看到错误响应(401 Unauthorized),表明授权正常工作,客户端应用发出授权请求后即可使用 API。

通过以上步骤,我们可以实现云服务的远程连接、配置变更检测,以及构建基于 Web API 和 SignalR 的应用程序,为开发和管理云应用提供了强大的支持。

6. Web API 与客户端集成的优势与工作流程

6.1 Web API 优势总结

Web API 作为一种强大的工具,在客户端与数据交互方面具有显著优势。以下是其主要优势的总结表格:
| 优势 | 说明 |
| ---- | ---- |
| 安全性增强 | 客户端不直接访问数据库,可选择任意身份验证方法,避免了直接访问数据库带来的安全风险,如硬编码连接字符串或暴露配置文件。 |
| 易于实现 | 相比 WCF 等技术,Web API 实现简单,无需复杂配置,更适合快速开发。 |
| 数据格式友好 | 以 JSON 和 XML 格式提供数据,方便各种客户端应用处理。 |

6.2 Web API 工作流程 mermaid 流程图

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px

    A(客户端应用):::process -->|请求数据| B(Web API 服务):::process
    B -->|查询数据库| C(SQL Server 数据库):::process
    C -->|返回数据| B
    B -->|返回数据| A

6.3 客户端与 Web API 交互示例

假设客户端应用需要获取订单数据,以下是一个简单的 JavaScript 示例,展示如何使用 Web API:

fetch('https://your-web-api-url/api/orders')
  .then(response => response.json())
  .then(data => {
    console.log('订单数据:', data);
    // 处理订单数据
  })
  .catch(error => {
    console.error('请求出错:', error);
  });

7. SignalR 实现与应用场景

7.1 SignalR 实现步骤

在项目中实现 SignalR 的步骤如下:
1. 安装 SignalR 库 :在 Visual Studio 中,通过 NuGet 包管理器安装 Microsoft.AspNet.SignalR 包。
2. 创建 SignalR 集线器 :创建一个继承自 Hub 的类,定义服务器端方法。

using Microsoft.AspNet.SignalR;

public class OrderHub : Hub
{
    public void UpdateOrderStatus(string orderId, string status)
    {
        // 更新订单状态的逻辑
        Clients.All.broadcastOrderStatus(orderId, status);
    }
}
  1. 配置 SignalR :在 Startup.cs 文件中配置 SignalR。
using Microsoft.Owin;
using Owin;
using Microsoft.AspNet.SignalR;

[assembly: OwinStartup(typeof(YourNamespace.Startup))]
namespace YourNamespace
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}
  1. 客户端代码 :在客户端 HTML 文件中引入 SignalR 客户端库,并连接到集线器。
<!DOCTYPE html>
<html>
<head>
    <title>SignalR 客户端</title>
    <script src="~/Scripts/jquery-3.6.0.min.js"></script>
    <script src="~/Scripts/jquery.signalR-2.4.3.min.js"></script>
    <script src="/signalr/hubs"></script>
    <script>
        $(function () {
            var orderHub = $.connection.orderHub;

            orderHub.client.broadcastOrderStatus = function (orderId, status) {
                console.log('订单 ' + orderId + ' 状态更新为: ' + status);
            };

            $.connection.hub.start().done(function () {
                // 连接成功后,可以调用服务器端方法
                orderHub.server.updateOrderStatus('123', '已处理');
            });
        });
    </script>
</head>
<body>
    <h1>SignalR 客户端示例</h1>
</body>
</html>

7.2 SignalR 应用场景

  • 实时订单状态更新 :如上述示例,当订单状态发生变化时,服务器可实时将更新推送给所有客户端。
  • 实时聊天系统 :用户发送消息后,服务器立即将消息推送给其他在线用户。
  • 实时数据监控 :监控系统实时获取数据,并将数据变化推送给客户端。

8. 总结与实践建议

8.1 关键技术总结

  • 远程桌面连接 :可用于云服务的高级诊断和配置,但手动修改环境需谨慎,建议使用启动任务。
  • 配置变更检测 :通过 RoleEnvironment.Changing RoleEnvironment.Changed 事件,可实现角色配置的动态更新。
  • 启动任务 :在角色启动前执行脚本,可进行环境自定义和配置更改。
  • Web API :构建 RESTful HTTP 服务,增强安全性和开发效率。
  • SignalR :实现实时 Web 连接应用,减少客户端轮询。

8.2 实践建议列表

  • 安全性 :在使用 Web API 和 SignalR 时,确保使用安全的身份验证方法,如 Azure AD 身份验证。
  • 可扩展性 :对于 SignalR,考虑使用背板解决方案(如 Azure Service Bus)以提高可扩展性。
  • 日志记录 :在启动任务和代码中添加日志记录,方便调试和问题排查。
  • 测试 :在开发过程中,进行充分的本地测试和集成测试,确保系统稳定运行。

通过掌握这些技术和建议,开发者可以更好地构建和管理云服务应用,实现高效、安全的客户端与服务器交互。

下载前必看:https://renmaiwang.cn/s/bvbfw Verilog设计_串并转换 / 移位寄存器实现了一种串并转换的功能,其核心原理在于移位寄存器的运用。 这里详细展示了串转并以及并转串两种不同的设计方案。 每一种转换模式都设有专属的使能信号,同时并行输出数据的格式提供了两种选择:最低有效位优先(lsb)和最高有效位优先(msb)。 串并转换技术主要应用于串行传输并行传输这两种数据传输模式之间的相互转换,而移位寄存器是达成这一目标的常用工具,能够支持并行及串行的数据输入输出操作。 这些移位寄存器通常被设定为“串行输入、并行输出”(SIPO)或“并行输入、串行输出”(PISO)两种工作模式。 在串行数据输出的过程中,构成数据和字符的码元会按照既定的时间顺序逐位进行传输。 相比之下,并行数据传输则是在同一时刻将固定数量(普遍为8位或16位等)的数据和字符码元同时发送至接收端。 数据输入通常采用串行格式进行。 一旦数据成功输入寄存器,它便可以在所有输出端同时被读取,或者选择逐位移出。 寄存器中的每个触发器均设计为边沿触发类型,并且所有触发器均以特定的时钟频率协同工作。 对于每一个输入位而言,它需要经过N个时钟周期才能最终在N个输出端呈现,从而完成并行输出。 值得注意的是,在串行加载数据期间,并行输出端的数据状态应保持稳定。 数据输入则采用并行格式。 在将数据写入寄存器的操作过程中,写/移位控制线必须暂时处于非工作状态;而一旦需要执行移位操作,控制线便会变为激活状态,并且寄存器会被锁定以保持当前状态。 只要时钟周期数不超过输入数据串的长度,数据输出端Q将按照预定的顺序逐位读出并行数据,并且必须明确区分最低有效位(LSB)和最高有效位(MSB)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值