microsoft-cus-rt / windowsazure
该项目提供了一套PHP客户端库,使用户能够轻松访问Windows Azure表、Blob、队列、服务运行时和服务管理API。
Requires
- php: >=5.6
- firebase/php-jwt: ^4.0
- guzzlehttp/guzzle: ^7.0
- laminas/laminas-mail: ^2.23
- laminas/laminas-mime: ^2.11
- microsoft/azure-storage: ^0.19.1
- pear/mail_mime: ^1.10
- pear/net_url2: ^2.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^1.12.2
- mayflower/php-codebrowser: ^1.1
- mikey179/vfsstream: ^1.6
- pdepend/pdepend: ^2.2
- phpdocumentor/phpdocumentor: ^2.8
- phploc/phploc: ^2.1
- phpmd/phpmd: ^2.4
- phpunit/phpunit: ^4.8.35
- sebastian/phpcpd: ^2.0
- squizlabs/php_codesniffer: ^2.6
This package is auto-updated.
Last update: 2024-09-23 10:57:45 UTC
README
Microsoft Azure SDK for PHP
该项目提供了一套PHP客户端库,使用户能够轻松访问Microsoft Azure表、Blob、队列、服务总线(队列和主题)、服务运行时和服务管理API。有关如何在Microsoft Azure上托管PHP应用程序的说明,请参阅Microsoft Azure PHP开发者中心。
重要公告
截至2021年2月,PHP的Azure SDK已进入淘汰阶段,不再由Microsoft官方支持。此存储库将不再维护。
如果您更喜欢使用PHP,可以直接调用Azure REST API
注意:请注意,PHP的Azure存储SDK将单独在其自己的仓库中维护
有关更多详细信息,请参阅我们的支持政策
功能
- 表
- 创建和删除表
- 创建、查询、插入、更新、合并和删除实体
- 批量操作
- REST API版本:请参见https://github.com/Azure/azure-storage-php
- 块
- 创建、列出和删除容器,处理容器元数据和权限,列出容器中的块
- 创建块和页块(从流或字符串),处理块和页,删除块
- 处理块属性、元数据、租约,对块进行快照
- REST API版本:请参见https://github.com/Azure/azure-storage-php
- 存储队列
- 创建、列出和删除队列,并处理队列元数据和属性
- 创建、获取、查看、更新和删除消息
- REST API版本:请参见https://github.com/Azure/azure-storage-php
- 服务总线
- 队列:创建、列出和删除队列;发送、接收、解锁和删除消息
- 主题:创建、列出和删除主题;创建、列出和删除订阅;发送、接收、解锁和删除消息;创建、列出和删除规则
- 服务运行时
- 发现服务中其他角色实例的端点地址和端口
- 获取配置设置和访问本地资源
- 获取当前角色和其他角色实例的角色实例信息
- 查询和设置当前角色的状态
- REST API版本:2011-03-08
- 服务管理
- 存储帐户:创建、更新、删除、列出、重新生成密钥
- 亲和组:创建、更新、删除、列出、获取属性
- 位置:列出
- 托管服务:创建、更新、删除、列出、获取属性
- 部署:创建、获取、删除、交换、更改配置、更新状态、升级、回滚
- 角色实例:重启、重映像
- REST API版本:2011-10-01
- 媒体服务
- 连接
- 导入资产、上传文件
- 编码/处理资产、创建作业、作业模板
- 管理媒体服务实体:创建/更新/读取/删除/获取列表
- 交付SAS和流媒体内容
- 动态加密:带Token限制和不带Token限制的AES和DRM(PlayReady/Widevine/FairPlay)
- 缩放编码预留单元类型
- 实时流:实时编码和透明通道、节目及其所有操作
- REST API版本:2.13
入门
下载源代码
要从GitHub获取源代码,请输入
git clone https://github.com/Azure/azure-sdk-for-php.git
cd ./azure-sdk-for-php
注意
解决依赖关系推荐的方式是使用Composer包管理器安装。
通过Composer安装
-
在项目的根目录下创建一个名为composer.json的文件,并将其中的代码添加进去。
{ "require": { "microsoft/windowsazure": "^0.5" } }
-
在项目根目录下下载composer.phar。
-
在项目根目录下打开命令提示符并执行以下命令。
php composer.phar install
注意
在Windows上,您还需要将Git可执行文件添加到PATH环境变量中。
用法
入门
在使用库调用任何Microsoft Azure API之前,您必须执行以下四个基本步骤。
-
首先,包含自动加载脚本
require_once "vendor/autoload.php";
-
包含您将要使用的命名空间。
要创建任何Microsoft Azure服务客户端,您需要使用ServicesBuilder类
use WindowsAzure\Common\ServicesBuilder;
要处理异常,您需要
use WindowsAzure\Common\ServiceException;
-
要实例化服务客户端,您还需要一个有效的连接字符串。格式如下
-
要访问实时存储服务(表、Blob、队列)
DefaultEndpointsProtocol=[http|https];AccountName=[yourAccount];AccountKey=[yourKey]
-
要访问模拟存储
UseDevelopmentStorage=true
-
要访问Service Bus
Endpoint=[yourEndpoint];SharedSecretIssuer=[yourWrapAuthenticationName];SharedSecretValue=[yourWrapPassword]
其中端点通常为
https://[你的命名空间].servicebus.windows.net
的格式。 -
要访问服务管理API
SubscriptionID=[yourSubscriptionId];CertificatePath=[filePathToYourCertificate]
-
-
实例化一个“REST代理”——它是给定服务的可用调用包装器。
-
对于存储服务
$tableRestProxy = ServicesBuilder::getInstance()->createTableService($connectionString); $blobRestProxy = ServicesBuilder::getInstance()->createBlobService($connectionString); $queueRestProxy = ServicesBuilder::getInstance()->createQueueService($connectionString);
-
对于Service Bus
$serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);
-
对于服务管理
$serviceManagementRestProxy = ServicesBuilder::getInstance()->createServiceManagementService($connectionString);
-
对于媒体服务
// 1 - Instantiate the credentials $credentials = new AzureAdTokenCredentials( '<tenant domain name>', new AzureAdClientSymmetricKey('<service principal client id>', '<service principal client key>'), AzureEnvironments::AZURE_CLOUD_ENVIRONMENT()); // 2 - Instantiate a token provider $provider = new AzureAdTokenProvider($credentials); // 3 - Connect to Azure Media Services $mediaServicesRestProxy = ServicesBuilder::getInstance()->createMediaServicesService(new MediaServicesSettings('<rest api endpoint>', $provider));
有关媒体服务身份验证的更多示例,请参阅示例文件夹。
-
表存储
以下是一些使用Table服务执行的常见操作的示例。更多请参阅如何使用Table服务。
创建一个表
要创建一个表,请调用createTable
try { // Create table. $tableRestProxy->createTable("mytable"); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
插入实体
要将实体添加到表中,请创建一个新的Entity
对象,并将其传递给TableRestProxy->insertEntity
。请注意,当您创建实体时,您必须指定一个PartitionKey
和RowKey
。这些是实体的唯一标识符,并且是查询速度比其他实体属性更快的值。系统使用PartitionKey
自动将表实体分布在多个存储节点上。
use MicrosoftAzure\Storage\Table\Models\Entity; use MicrosoftAzure\Storage\Table\Models\EdmType; $entity = new Entity(); $entity->setPartitionKey("pk"); $entity->setRowKey("1"); $entity->addProperty("PropertyName", EdmType::STRING, "Sample"); try{ $tableRestProxy->insertEntity("mytable", $entity); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
查询实体
要查询实体,您可以调用queryEntities
。您检索的实体子集将由您使用的过滤器确定(有关更多信息,请参阅查询表和实体)。您也可以不提供任何过滤器。
$filter = "RowKey eq '2'"; try { $result = $tableRestProxy->queryEntities("mytable", $filter); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; } $entities = $result->getEntities(); foreach($entities as $entity){ echo $entity->getPartitionKey().":".$entity->getRowKey()."<br />"; }
Blob存储
要开始使用Blob服务,您必须包含BlobService
和BlobSettings
命名空间,并设置ACCOUNT_NAME
和ACCOUNT_KEY
配置设置以使用您的凭据。然后,使用BlobService
工厂实例化包装器。
以下是一些使用Blob服务执行的常见操作的示例。更多请参阅如何使用Blob服务。
创建一个容器
// OPTIONAL: Set public access policy and metadata. // Create container options object. $createContainerOptions = new CreateContainerOptions(); // Set public access policy. Possible values are // PublicAccessType::CONTAINER_AND_BLOBS and PublicAccessType::BLOBS_ONLY. // CONTAINER_AND_BLOBS: full public read access for container and blob data. // BLOBS_ONLY: public read access for blobs. Container data not available. // If this value is not specified, container data is private to the account owner. $createContainerOptions->setPublicAccess(PublicAccessType::CONTAINER_AND_BLOBS); // Set container metadata $createContainerOptions->addMetaData("key1", "value1"); $createContainerOptions->addMetaData("key2", "value2"); try { // Create container. $blobRestProxy->createContainer("mycontainer", $createContainerOptions); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
有关容器ACL的更多信息,请参阅设置容器ACL(REST API)。
上传一个blob
要将文件作为blob上传,请使用BlobRestProxy->createBlockBlob方法。如果blob不存在,此操作将创建它,如果已存在,则将其覆盖。以下代码示例假设容器已创建,并使用fopen以流的形式打开文件。
$content = fopen("myfile.txt", "r"); $blob_name = "myblob"; try { //Upload blob $blobRestProxy->createBlockBlob("mycontainer", $blob_name, $content); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
虽然上面的示例将blob作为流上传,但blob也可以作为字符串上传。
列出容器中的blob
要列出容器中的blob,请使用带有foreach循环的BlobRestProxy->listBlobs方法遍历结果。以下代码输出容器中每个blob的名称和URI。
try { // List blobs. $blob_list = $blobRestProxy->listBlobs("mycontainer"); $blobs = $blob_list->getBlobs(); foreach($blobs as $blob) { echo $blob->getName().": ".$blob->getUrl()."<br />"; } } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
存储队列
要开始使用队列服务,您必须包含QueueService
和QueueSettings
命名空间,并设置ACCOUNT_NAME
和ACCOUNT_KEY
配置设置以获取凭证。然后使用QueueService
工厂实例化包装器。
以下是使用队列服务执行的常见操作的示例。有关更多信息,请阅读如何使用队列服务。
创建队列
QueueRestProxy对象允许您使用createQueue方法创建队列。在创建队列时,您可以设置队列上的选项,但这不是必需的。
$createQueueOptions = new CreateQueueOptions(); $createQueueOptions->addMetaData("key1", "value1"); $createQueueOptions->addMetaData("key2", "value2"); try { // Create queue. $queueRestProxy->createQueue("myqueue", $createQueueOptions); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
向队列添加消息
要将消息添加到队列,请使用QueueRestProxy->createMessage。该方法接受队列名称、消息文本和消息选项(这些是可选的)。为了与其他兼容,您可能需要对消息进行base64编码。
try { // Create message. $msg = "Hello World!"; // optional: $msg = base64_encode($msg); $queueRestProxy->createMessage("myqueue", $msg); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
查看下一个消息
您可以通过调用QueueRestProxy->peekMessages来查看队列前面(或多个)的消息,而无需将其从队列中删除。
// OPTIONAL: Set peek message options. $message_options = new PeekMessagesOptions(); $message_options->setNumberOfMessages(1); // Default value is 1. try { $peekMessagesResult = $queueRestProxy->peekMessages("myqueue", $message_options); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; } $messages = $peekMessagesResult->getQueueMessages(); // View messages. $messageCount = count($messages); if($messageCount <= 0){ echo "There are no messages.<br />"; } else{ foreach($messages as $message) { echo "Peeked message:<br />"; echo "Message Id: ".$message->getMessageId()."<br />"; echo "Date: ".date_format($message->getInsertionDate(), 'Y-m-d')."<br />"; echo "Message text: ".$message->getMessageText()."<br /><br />"; } }
从队列中删除下一个消息
您的代码通过两个步骤从队列中删除消息。首先,您调用QueueRestProxy->listMessages,这将使消息对任何其他从队列中读取的代码不可见。默认情况下,此消息将保持30秒不可见(如果在这段时间内未删除消息,则它将再次在队列中可见)。要完成从队列中删除消息,您必须调用QueueRestProxy->deleteMessage。
// Get message. $listMessagesResult = $queueRestProxy->listMessages("myqueue"); $messages = $listMessagesResult->getQueueMessages(); $message = $messages[0]; // Process message // Get message Id and pop receipt. $messageId = $message->getMessageId(); $popReceipt = $message->getPopReceipt(); try { // Delete message. $queueRestProxy->deleteMessage("myqueue", $messageId, $popReceipt); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
服务总线队列
当前的PHP服务总线API仅支持ACS连接字符串。您需要使用PowerShell在目前的时间创建一个新的ACS服务总线命名空间。首先,确保您已安装Azure PowerShell,然后在PowerShell命令提示符下运行
Add-AzureAccount # this will sign you in New-AzureSBNamespace -CreateACSNamespace $true -Name 'mytestbusname' -Location 'West US' -NamespaceType 'Messaging'
如果成功,您将在PowerShell输出中获取连接字符串。如果您在它上遇到连接错误,并且连接字符串看起来像Endpoint=sb://...,将其更改为Endpoint=https://...
创建队列
try { $queueInfo = new QueueInfo("myqueue"); // Create queue. $serviceBusRestProxy->createQueue($queueInfo); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
发送消息
要将消息发送到服务总线队列,您的应用程序将调用ServiceBusRestProxy->sendQueueMessage方法。发送到(和从)服务总线队列的消息是BrokeredMessage
类的实例。
try { // Create message. $message = new BrokeredMessage(); $message->setBody("my message"); // Send message. $serviceBusRestProxy->sendQueueMessage("myqueue", $message); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
接收消息
从队列接收消息的主要方式是使用ServiceBusRestProxy->receiveQueueMessage
方法。消息可以通过两种不同的模式接收:ReceiveAndDelete
(在读取时标记消息为已消费)和PeekLock
(锁定消息一段时间,但不删除)。
以下示例演示了如何使用PeekLock
模式(非默认模式)接收和处理消息。
try { // Set the receive mode to PeekLock (default is ReceiveAndDelete). $options = new ReceiveMessageOptions(); $options->setPeekLock(true); // Receive message. $message = $serviceBusRestProxy->receiveQueueMessage("myqueue", $options); echo "Body: ".$message->getBody()."<br />"; echo "MessageID: ".$message->getMessageId()."<br />"; // *** Process message here *** // Delete message. $serviceBusRestProxy->deleteMessage($message); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
服务总线主题
创建主题
try { // Create topic. $topicInfo = new TopicInfo("mytopic"); $serviceBusRestProxy->createTopic($topicInfo); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
使用默认(MatchAll)过滤器创建订阅
try { // Create subscription. $subscriptionInfo = new SubscriptionInfo("mysubscription"); $serviceBusRestProxy->createSubscription("mytopic", $subscriptionInfo); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
向主题发送消息
发送到服务总线主题的消息是BrokeredMessage
类的实例。
try { // Create message. $message = new BrokeredMessage(); $message->setBody("my message"); // Send message. $serviceBusRestProxy->sendTopicMessage("mytopic", $message); } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
从主题接收消息
接收订阅消息的主要方法是使用 ServiceBusRestProxy->receiveSubscriptionMessage 方法。接收到的消息可以在两种不同的模式下工作:默认的 ReceiveAndDelete 和类似于服务总线队列的 PeekLock。
以下示例演示了如何使用 ReceiveAndDelete 模式(默认模式)接收并处理消息。
try { // Set receive mode to PeekLock (default is ReceiveAndDelete) $options = new ReceiveMessageOptions(); $options->setReceiveAndDelete(); // Get message. $message = $serviceBusRestProxy->receiveSubscriptionMessage("mytopic", "mysubscription", $options); echo "Body: ".$message->getBody()."<br />"; echo "MessageID: ".$message->getMessageId()."<br />"; } catch(ServiceException $e){ $code = $e->getCode(); $error_message = $e->getMessage(); echo $code.": ".$error_message."<br />"; }
服务管理
设置证书
您需要创建两个证书,一个用于服务器(.cer 文件)和一个用于客户端(.pem 文件)。要使用 OpenSSL 创建 .pem 文件,请执行以下操作
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
要创建 .cer 证书,请执行以下操作
openssl x509 -inform pem -in mycert.pem -outform der -out mycert.cer
列出可用位置
$serviceManagementRestProxy->listLocations(); $locations = $result->getLocations(); foreach($locations as $location){ echo $location->getName()."<br />"; }
创建存储服务
要创建存储服务,您需要一个服务名称(3到24个之间的小写字母,且在 Microsoft Azure 中唯一),一个标签(服务的 base-64 编码名称,最多100个字符),以及一个位置或亲和组。提供服务的描述是可选的。
$name = "mystorageservice"; $label = base64_encode($name); $options = new CreateStorageServiceOptions(); $options->setLocation('West US'); $result = $serviceManagementRestProxy->createStorageService($name, $label, $options);
创建云服务
云服务也称为托管服务(来自 Microsoft Azure 的早期版本)。createHostedServices 方法允许您通过提供托管服务名称(在 Microsoft Azure 中必须是唯一的)、标签(基础64编码的托管服务名称)和 CreateServiceOptions 对象(允许您设置服务的位置或亲和组)来创建新的托管服务。
$name = "myhostedservice"; $label = base64_encode($name); $options = new CreateServiceOptions(); $options->setLocation('West US'); // Instead of setLocation, you can use setAffinityGroup to set an affinity group. $result = $serviceManagementRestProxy->createHostedService($name, $label, $options);
创建部署
要将新部署到 Azure,您必须将包文件存储在与要上传包的托管服务相同的订阅下的 Microsoft Azure Blob 存储帐户中。您可以使用 Microsoft Azure PowerShell cmdlets 或 cspack 命令行工具 创建部署包。
$hostedServiceName = "myhostedservice"; $deploymentName = "v1"; $slot = DeploymentSlot::PRODUCTION; $packageUrl = "URL_for_.cspkg_file"; $configuration = file_get_contents('path_to_.cscfg_file'); $label = base64_encode($hostedServiceName); $result = $serviceManagementRestProxy->createDeployment($hostedServiceName, $deploymentName, $slot, $packageUrl, $configuration, $label); $status = $serviceManagementRestProxy->getOperationStatus($result); echo "Operation status: ".$status->getStatus()."<br />";
媒体服务
使用文件创建新资产
要使用文件创建资产,您需要创建一个空资产,创建具有写入权限的访问策略,创建一个连接您的资产和访问策略的定位器,执行实际的上传并生成文件信息。
$asset = new Asset(Asset::OPTIONS_NONE); $asset = $restProxy->createAsset($asset); $access = new AccessPolicy('[Some access policy name]'); $access->setDurationInMinutes([Munites AccessPolicy is valid]); $access->setPermissions(AccessPolicy::PERMISSIONS_WRITE); $access = $restProxy->createAccessPolicy($access); $sasLocator = new Locator($asset, $access, Locator::TYPE_SAS); $sasLocator->setStartTime(new \DateTime('now -5 minutes')); $sasLocator = $restProxy->createLocator($sasLocator); $restProxy->uploadAssetFile($sasLocator, '[file name]', '[file content]'); $restProxy->createFileInfos($asset);
编码资产
要进行媒体文件编码,您需要一个包含文件的输入资产($inputAsset)(类似于前一章中的内容)。您还需要创建一个任务数据对象数组和作业数据对象。要创建任务对象,请使用媒体处理器、任务 XML 主体和配置名称。
$mediaProcessor = $this->restProxy->getLatestMediaProcessor('[Media processor]'); $task = new Task('[Task XML body]', $mediaProcessor->getId(), TaskOptions::NONE); $task->setConfiguration('[Configuration name]'); $restProxy->createJob(new Job(), array($inputAsset), array($task));
获取编码资产的公共 URL
在您上传了媒体文件并对其进行编码后,您可以获取该文件的下载 URL 或多个比特率文件的流媒体 URL。创建一个新的具有读取权限的访问策略,并通过定位器将其与作业输出资产链接。
$accessPolicy = new AccessPolicy('[Some access policy name]'); $accessPolicy->setDurationInMinutes([Munites AccessPolicy is valid]); $accessPolicy->setPermissions(AccessPolicy::PERMISSIONS_READ); $accessPolicy = $restProxy->createAccessPolicy($accessPolicy); // Download URL $sasLocator = new Locator($asset, $accessPolicy, Locator::TYPE_SAS); $sasLocator->setStartTime(new \DateTime('now -5 minutes')); $sasLocator = $restProxy->createLocator($sasLocator); // Azure needs time to publish media sleep(30); $downloadUrl = $sasLocator->getBaseUri() . '/' . '[File name]' . $sasLocator->getContentAccessComponent() // Streaming URL $originLocator = new Locator($asset, $accessPolicy, Locator::TYPE_ON_DEMAND_ORIGIN); $originLocator = $restProxy->createLocator($originLocator); // Azure needs time to publish media sleep(30); $streamingUrl = $originLocator->getPath() . '[Manifest file name]' . "/manifest";
管理媒体服务实体
媒体服务 CRUD 操作通过媒体服务 REST 代理类执行。它具有“创建资产”、“创建定位器”、“创建作业”等方法,用于实体创建。
要检索所有实体列表,您可以使用“getAssetList”、“getAccessPolicyList”、“getLocatorList”、“getJobList”等方法。要获取单个实体数据,请使用“getAsset”、“getJob”、“getTask”等方法,传递实体标识符或具有非空标识符的实体数据模型对象作为参数。
使用“updateLocator”、“updateAsset”、“updateAssetFile”等方法更新实体,传递实体数据模型对象作为参数。在数据模型对象中指定有效的实体标识符非常重要。
使用“deleteAsset”、“deleteAccessPolicy”、“deleteJob”等方法删除实体,传递实体标识符或具有非空标识符的实体数据模型对象作为参数。
您还可以使用“getAssetLocators”、“getAssetParentAssets”、“getAssetStorageAccount”、“getLocatorAccessPolicy”、“getJobTasks”等方法获取关联实体,这些方法需要一个包含非空标识符的实体标识符或实体数据模型对象作为参数。
您可以在IMediaServices接口中找到所有可用方法的完整列表。
有关更多示例,请参阅Microsoft Azure PHP开发者中心
需要帮助?
如果您在使用提供的代码时遇到问题,请务必查看Microsoft Azure在Stack Overflow上的开发者论坛。
贡献代码或提供反馈
如果您想成为这个项目的积极贡献者,请遵循Microsoft Azure项目贡献指南中提供的说明。
要设置您的开发环境,请按照此wiki页面中的说明操作。
如果您在库中发现任何错误,请在项目的问题部分提交一个问题。
了解更多信息
本项目已采用Microsoft开源行为准则。有关更多信息,请参阅行为准则常见问题解答或通过opencode@microsoft.com联系以获取任何额外的疑问或评论。