中国区 Azure 开发人员指南

有一些工具和文档可以帮助开发人员创建云应用程序并将其部署到世纪互联(中国区 Azure)运营的 Microsoft Azure。 大多数当前可用的技术内容(例如全球 Azure 文档)都假设应用程序是针对全球 Azure 开发的。 中国区 Azure Docs(中文)提供适合中国区 Azure 的技术内容。 有关中国区 Azure 提供的服务,请参阅中国区 Azure 的服务可用性和路线图

在提到适用于全球 Azure 服务的公用内容时,请务必修改相关的步骤,或自定义任何指定全球 Azure 服务设置的示例代码。 例如,自定义 Azure 服务终结点

针对 Azure 用户进行开发

如果你习惯了针对其他区域中的用户开发云服务,请务必考虑中国用户的以下预期:

  • 移动优先:移动设备(而不是电脑)被认为是联网世界的源头。 请确保设计策略以移动为中心。
  • QR 码和屏幕扫描行为:网站、印刷广告、名片和其他媒体通常包含 QR 码。 可在网站的页首和页脚中包含 QR 码,使访客能够在其手机上快速加载网站的手机版。
  • 内容本地化:本地化不仅仅是指翻译内容。 请花些时间来了解目标市场的数字环境,以及业务决策造成的文化影响, 然后相应地定制内容。

使用中国的社交网站和媒体服务

在中国,常用的西方社交媒体网站和服务可能已被封锁。 在中国运营 Web 内容时:

  • 请避免在网站前端连接到 Google 服务。 Google 连同其所有服务在中国已被封锁。 为获得最佳效果,需在网站中避免使用 Google 服务。 例如,将 Google 地图替换为百度地图,使用本机字体而不要使用 Google 字体。
  • 不要嵌入来自 YouTube 或 Vimeo 的视频。 这两个服务在中国已被封锁。 在本地或者在优酷、爱奇艺、土豆等中国视频托管网站中托管视频,或使用 Azure 媒体服务托管视频。 使用搜索引擎优化 (SEO) 审核工具针对百度(在中国最常用的搜索引擎)优化自己的网站。
  • 创建适应中国环境的社交网络内容。 全球流行的社交网络,例如 Facebook、Twitter 和 Instagram,已被封锁。 创建专门针对中国社交网络(例如微信和新浪微博)定制的社交营销策略。 Azure 目前不提供本地社交网络集成(即社交标识提供者)。

检查 Azure 中的终结点

中国区 Azure 与全球 Azure 不同,因此,必须更改全球 Azure 源(例如示例代码或已发布的文档)中的所有 Azure 服务终结点。

下表显示了要更改的终结点。

另请参阅:

服务类别 全球 Azure URI Azure URI(中国)
Azure(通用) *.windows.net *.chinacloudapi.cn
Azure 应用配置 *.azconfig.io *.azconfig.azure.cn
Azure 计算 *.cloudapp.net *.chinacloudapp.cn
Azure 存储 *.blob.core.windows.net *.queue.core.windows.net *.table.core.windows.net *.dfs.core.windows.net *.blob.core.chinacloudapi.cn *.queue.core.chinacloudapi.cn *.table.core.chinacloudapi.cn *.dfs.core.chinacloudapi.cn
Azure 服务管理 https://management.core.windows.net https://management.core.chinacloudapi.cn
Azure 资源管理器 https://management.azure.com https://management.chinacloudapi.cn
Azure 门户 https://portal.azure.com https://portal.azure.cn
SQL 数据库 *.database.windows.net *.database.chinacloudapi.cn
SQL Azure 数据库管理 API https://management.database.windows.net https://management.database.chinacloudapi.cn
Azure 服务总线 *.servicebus.windows.net *.servicebus.chinacloudapi.cn
Azure SignalR 服务 *.service.signalr.net *.signalr.azure.cn
Azure 时序见解 *.timeseries.azure.com *.insights.timeseries.azure.cn *.timeseries.azure.cn *.insights.timeseries.azure.cn
Azure 访问控制服务 *.accesscontrol.windows.net *.accesscontrol.chinacloudapi.cn
Azure HDInsight *.azurehdinsight.net *.azurehdinsight.cn
SQL 数据库导入/导出服务终结点  1. 中国东部 https://sh1prod-dacsvc.chinacloudapp.cn/dacwebservice.svc
2. 中国北部 https://bj1prod-dacsvc.chinacloudapp.cn/dacwebservice.svc
MySQL PaaS *.mysqldb.chinacloudapi.cn
Azure Service Fabric 群集 *.cloudapp.azure.com *.chinaeast.chinacloudapp.cn
Azure Spring Cloud *.azuremicroservices.io *.microservices.azure.cn
Azure Active Directory (Azure AD) *.onmicrosoft.com *.partner.onmschina.cn
Azure AD 登录 https://login.microsoftonline.com https://login.partner.microsoftonline.cn
Microsoft Graph https://graph.microsoft.com https://microsoftgraph.chinacloudapi.cn
Azure 认知服务 https://api.projectoxford.ai/face/v1.0 https://api.cognitive.azure.cn/face/v1.0
Azure 机器人服务 <*.botframework.com> <*.botframework.azure.cn>
Azure Key Vault API *.vault.azure.net *.vault.azure.cn
使用 PowerShell 登录:
- Azure 经典门户
- Azure 资源管理器
- Azure AD
- Add-AzureAccount
- Connect-AzureRmAccount
- Connect-msolservice
 - Add-AzureAccount -Environment AzureChinaCloud
- Connect-AzureRmAccount -Environment AzureChinaCloud
- Connect-msolservice -AzureEnvironment AzureChinaCloud

Application Insights

注意

Azure 应用服务的基于无代码代理/扩展的监视目前不受支持。 Snapshot Debugger 目前也不可用。

修改 SDK 终结点

若要从此区域的 Application Insights 发送数据,需要修改 Application Insights SDK 使用的默认终结点地址。 每个 SDK 都需要进行稍有不同的修改。

使用 applicationinsights.config 的 .NET

<ApplicationInsights>
  ...
  <TelemetryModules>
    <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryModule, Microsoft.AI.PerfCounterCollector">
      <QuickPulseServiceEndpoint>https://quickpulse.applicationinsights.azure.cn/QuickPulseService.svc</QuickPulseServiceEndpoint>
    </Add>
  </TelemetryModules>
    ...
  <TelemetryChannel>
     <EndpointAddress>https://dc.applicationinsights.azure.cn/v2/track</EndpointAddress>
  </TelemetryChannel>
  ...
  <ApplicationIdProvider Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.ApplicationInsightsApplicationIdProvider, Microsoft.ApplicationInsights">
    <ProfileQueryEndpoint>https://dc.applicationinsights.azure.cn/api/profiles/{0}/appId</ProfileQueryEndpoint>
  </ApplicationIdProvider>
  ...
</ApplicationInsights>

.NET Core

按如下所示修改项目中的 appsettings.json 文件以调整主终结点:

"ApplicationInsights": {
    "InstrumentationKey": "instrumentationkey",
    "TelemetryChannel": {
      "EndpointAddress": "https://dc.applicationinsights.azure.cn/v2/track"
    }
  }

实时指标和配置文件查询终结点的值只能通过代码设置。 若要通过代码替代所有终结点值的默认值,请在 Startup.cs 文件的 ConfigureServices 方法中进行以下更改:

using Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId;
using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse; //place at top of Startup.cs file

   services.ConfigureTelemetryModule<QuickPulseTelemetryModule>((module, o) => module.QuickPulseServiceEndpoint="https://quickpulse.applicationinsights.azure.cn/QuickPulseService.svc");

   services.AddSingleton(new ApplicationInsightsApplicationIdProvider() { ProfileQueryEndpoint = "https://dc.applicationinsights.azure.cn/api/profiles/{0}/appId" }); 

   services.AddSingleton<ITelemetryChannel>(new ServerTelemetryChannel() { EndpointAddress = "https://dc.applicationinsights.azure.cn/v2/track" });

    //place in ConfigureServices method. If present, place this prior to   services.AddApplicationInsightsTelemetry("instrumentation key");

Java

修改 applicationinsights.xml 文件以更改默认终结点地址。

<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
  <InstrumentationKey>ffffeeee-dddd-cccc-bbbb-aaaa99998888</InstrumentationKey>
  <TelemetryModules>
    <Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebRequestTrackingTelemetryModule"/>
    <Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebSessionTrackingTelemetryModule"/>
    <Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebUserTrackingTelemetryModule"/>
  </TelemetryModules>
  <TelemetryInitializers>
    <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebOperationIdTelemetryInitializer"/>
    <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebOperationNameTelemetryInitializer"/>
    <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebSessionTelemetryInitializer"/>
    <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebUserTelemetryInitializer"/>
    <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebUserAgentTelemetryInitializer"/>
  </TelemetryInitializers>
  <!--Add the following Channel value to modify the Endpoint address-->
  <Channel type="com.microsoft.applicationinsights.channel.concrete.inprocess.InProcessTelemetryChannel">
  <EndpointAddress>https://dc.applicationinsights.azure.cn/v2/track</EndpointAddress>
  </Channel>
</ApplicationInsights>

Spring Boot

修改 application.properties 文件并添加:

azure.application-insights.channel.in-process.endpoint-address= https://dc.applicationinsights.azure.cn/v2/track

Node.js

var appInsights = require("applicationinsights");
appInsights.setup('INSTRUMENTATION_KEY');
appInsights.defaultClient.config.endpointUrl = "https://dc.applicationinsights.azure.cn/v2/track"; // ingestion
appInsights.defaultClient.config.profileQueryEndpoint = "https://dc.applicationinsights.azure.cn/api/profiles/{0}/appId"; // appid/profile lookup
appInsights.defaultClient.config.quickPulseHost = "https://quickpulse.applicationinsights.azure.cn/QuickPulseService.svc"; //live metrics
appInsights.Configuration.start();

也可以通过环境变量配置终结点:

Instrumentation Key: “APPINSIGHTS_INSTRUMENTATIONKEY”
Profile Endpoint: “https://dc.applicationinsights.azure.cn/api/profiles/{0}/appId”
Live Metrics Endpoint: "https://quickpulse.applicationinsights.azure.cn/QuickPulseService.svc"

JavaScript

<script type="text/javascript">
var sdkInstance="appInsightsSDK";window[sdkInstance]="appInsights";var aiName=window[sdkInstance],aisdk=window[aiName]||function(e){function n(e){i[e]=function(){var n=arguments;i.queue.push(function(){i[e].apply(i,n)})}}var i={config:e};i.initialize=!0;var a=document,t=window;setTimeout(function(){var n=a.createElement("script");n.src=e.url||"https://az416426.vo.msecnd.net/next/ai.2.min.js",a.getElementsByTagName("script")[0].parentNode.appendChild(n)});try{i.cookie=a.cookie}catch(e){}i.queue=[],i.version=2;for(var r=["Event","PageView","Exception","Trace","DependencyData","Metric","PageViewPerformance"];r.length;)n("track"+r.pop());n("startTrackPage"),n("stopTrackPage");var o="Track"+r[0];if(n("start"+o),n("stop"+o),!(!0===e.disableExceptionTracking||e.extensionConfig&&e.extensionConfig.ApplicationInsightsAnalytics&&!0===e.extensionConfig.ApplicationInsightsAnalytics.disableExceptionTracking)){n("_"+(r="onerror"));var s=t[r];t[r]=function(e,n,a,t,o){var c=s&&s(e,n,a,t,o);return!0!==c&&i["_"+r]({message:e,url:n,lineNumber:a,columnNumber:t,error:o}),c},e.autoExceptionInstrumented=!0}return i}
(
	{
	instrumentationKey:"INSTRUMENTATION_KEY",
	endpointUrl: "https://dc.applicationinsights.azure.cn/v2/track"
  }
);
window[aiName]=aisdk,aisdk.queue&&0===aisdk.queue.length&&aisdk.trackPageView({});
</script>

后续步骤