Skip to content

Commit 7822509

Browse files
authored
Merge pull request #271018 from MicrosoftDocs/main
4/3 11:00 AM IST Publish
2 parents 88627e0 + 443e9ef commit 7822509

39 files changed

+1041
-449
lines changed

articles/aks/howto-deploy-java-liberty-app.md

Lines changed: 55 additions & 38 deletions
Large diffs are not rendered by default.

articles/api-management/configure-custom-domain.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ API Management offers a free, managed TLS certificate for your domain, if you do
105105
* Not supported in the following Azure regions: France South and South Africa West
106106
* Currently available only in the Azure cloud
107107
* Does not support root domain names (for example, `contoso.com`). Requires a fully qualified name such as `api.contoso.com`.
108+
* Supports only public domain names
108109
* Can only be configured when updating an existing API Management instance, not when creating an instance
109110

110111

articles/app-service/quickstart-python.md

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -59,66 +59,6 @@ To run the application locally:
5959
pip install -r requirements.txt
6060
```
6161

62-
1. Integrate a database:
63-
64-
```Python
65-
66-
from azure.cosmos.aio import CosmosClient
67-
from azure.cosmos import exceptions
68-
from azure.cosmos.partition_key import PartitionKey
69-
70-
from configs.credential import HOST, MASTER_KEY, DATABASE_ID
71-
72-
73-
def get_database_client():
74-
# Initialize the Cosmos client
75-
client = CosmosClient(HOST, MASTER_KEY)
76-
77-
# Create or get a reference to a database
78-
try:
79-
database = client.create_database_if_not_exists(id=DATABASE_ID)
80-
print(f'Database "{DATABASE_ID}" created or retrieved successfully.')
81-
82-
except exceptions.CosmosResourceExistsError:
83-
database = client.get_database_client(DATABASE_ID)
84-
print('Database with id \'{0}\' was found'.format(DATABASE_ID))
85-
86-
return database
87-
88-
89-
def get_container_client(container_id):
90-
database = get_database_client()
91-
# Create or get a reference to a container
92-
try:
93-
container = database.create_container(id=container_id, partition_key=PartitionKey(path='/partitionKey'))
94-
print('Container with id \'{0}\' created'.format(container_id))
95-
96-
except exceptions.CosmosResourceExistsError:
97-
container = database.get_container_client(container_id)
98-
print('Container with id \'{0}\' was found'.format(container_id))
99-
100-
return container
101-
102-
async def create_item(container_id, item):
103-
async with CosmosClient(HOST, credential=MASTER_KEY) as client:
104-
database = client.get_database_client(DATABASE_ID)
105-
container = database.get_container_client(container_id)
106-
await container.upsert_item(body=item)
107-
108-
async def get_items(container_id):
109-
items = []
110-
try:
111-
async with CosmosClient(HOST, credential=MASTER_KEY) as client:
112-
database = client.get_database_client(DATABASE_ID)
113-
container = database.get_container_client(container_id)
114-
async for item in container.read_all_items():
115-
items.append(item)
116-
except Exception as e:
117-
print(f"An error occurred: {e}")
118-
119-
return items
120-
```
121-
12262
1. Run the app:
12363

12464
```Console

articles/app-service/quickstart-wordpress.md

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ description: Create your first WordPress site on Azure App Service in minutes.
44
keywords: app service, azure app service, wordpress, preview, app service on linux, plugins, mysql flexible server, wordpress on linux, php
55
author: msangapu-msft
66
ms.topic: quickstart
7-
ms.date: 05/15/2023
7+
ms.date: 03/28/2024
88
# ms.devlang: wordpress
99
ms.author: msangapu
1010
ms.custom: mvc, linux-related-content
@@ -17,14 +17,6 @@ In this quickstart, you'll learn how to create and deploy your first [WordPress]
1717

1818
To complete this quickstart, you need an Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?ref=microsoft.com&utm_source=microsoft.com&utm_medium=docs).
1919

20-
> [!IMPORTANT]
21-
> After November 28, 2022, [PHP will only be supported on App Service on Linux.](https://github.com/Azure/app-service-linux-docs/blob/master/Runtime_Support/php_support.md#end-of-life-for-php-74).
22-
>
23-
> For migrating WordPress to App Service, visit [Migrating to App Service](migrate-wordpress.md). Additional documentation can be found at [WordPress - App Service on Linux](https://github.com/Azure/wordpress-linux-appservice).
24-
>
25-
> To submit feedback on improving the WordPress experience on App Service, visit [Web Apps Community](https://feedback.azure.com/d365community/forum/b09330d1-c625-ec11-b6e6-000d3a4f0f1c).
26-
>
27-
2820
## Create WordPress site using Azure portal
2921

3022
1. To start creating the WordPress site, browse to [https://portal.azure.com/#create/WordPress.WordPress](https://portal.azure.com/#create/WordPress.WordPress).

articles/azure-functions/functions-bindings-signalr-service-trigger.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ See [Class based model](../azure-signalr/signalr-concept-serverless-development-
5050
public class HubName1 : ServerlessHub
5151
{
5252
[FunctionName("SignalRTest")]
53-
public async Task SendMessage([SignalRTrigger]InvocationContext invocationContext, string message, ILogger logger)
53+
public Task SendMessage([SignalRTrigger]InvocationContext invocationContext, string message, ILogger logger)
5454
{
5555
logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
5656
}
@@ -63,7 +63,7 @@ Traditional model obeys the convention of Azure Function developed by C#. If you
6363

6464
```cs
6565
[FunctionName("SignalRTest")]
66-
public static async Task Run([SignalRTrigger("SignalRTest", "messages", "SendMessage", parameterNames: new string[] {"message"})]InvocationContext invocationContext, string message, ILogger logger)
66+
public static Task Run([SignalRTrigger("SignalRTest", "messages", "SendMessage", parameterNames: new string[] {"message"})]InvocationContext invocationContext, string message, ILogger logger)
6767
{
6868
logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
6969
}
@@ -73,7 +73,7 @@ Because it can be hard to use `ParameterNames` in the trigger, the following exa
7373

7474
```cs
7575
[FunctionName("SignalRTest")]
76-
public static async Task Run([SignalRTrigger("SignalRTest", "messages", "SendMessage")]InvocationContext invocationContext, [SignalRParameter]string message, ILogger logger)
76+
public static Task Run([SignalRTrigger("SignalRTest", "messages", "SendMessage")]InvocationContext invocationContext, [SignalRParameter]string message, ILogger logger)
7777
{
7878
logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
7979
}
@@ -113,7 +113,7 @@ app.generic("function1",
113113
Here's the JavaScript code:
114114

115115
```javascript
116-
module.exports = async function (context, invocation) {
116+
module.exports = function (context, invocation) {
117117
context.log(`Receive ${context.bindingData.message} from ${invocation.ConnectionId}.`)
118118
};
119119
```

articles/azure-netapp-files/whats-new.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ ms.author: anfdocs
1414

1515
Azure NetApp Files is updated regularly. This article provides a summary about the latest new features and enhancements.
1616

17+
## March 2024
18+
1719
* [Large volumes (Preview) improvement:](large-volumes-requirements-considerations.md) new minimum size of 50 TiB
1820

1921
Large volumes support a minimum size of 50 TiB. Large volumes still support a maximum quota of 500 TiB.
2022

21-
## March 2024
22-
2323
* [Availability zone volume placement](manage-availability-zone-volume-placement.md) is now generally available (GA).
2424

2525
You can deploy new volumes in the logical availability zone of your choice to create cross-zone volumes to improve resiliency in case of zonal failures. This feature is available in all availability zone-enabled regions with Azure NetApp Files presence.

articles/azure-signalr/signalr-concept-serverless-development-config.md

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,17 @@ The class-based model is dedicated for C#.
7676
The class-based model provides better programming experience, which can replace SignalR input and output bindings, with the following features:
7777
- More flexible negotiation, sending messages and managing groups experience.
7878
- More managing functionalities are supported, including closing connections, checking whether a connection, user, or group exists.
79-
- Strongly Typed hub
80-
- Unified connection string setting in one place.
79+
- Strongly typed hub
80+
- Unified hub name and connection string setting in one place.
8181

8282
The following code demonstrates how to write SignalR bindings in class-based model:
8383

84-
In the *Functions.cs* file, define your hub, which extends a base class `ServerlessHub`:
84+
Firstly, define your hub derived from a class `ServerlessHub`:
8585
```cs
8686
[SignalRConnection("AzureSignalRConnectionString")]
8787
public class Functions : ServerlessHub
8888
{
89-
private const string HubName = nameof(Functions);
89+
private const string HubName = nameof(Functions); // Used by SignalR trigger only
9090
9191
public Functions(IServiceProvider serviceProvider) : base(serviceProvider)
9292
{
@@ -126,7 +126,7 @@ var host = new HostBuilder()
126126

127127
### Negotiation experience in class-based model
128128

129-
Instead of using SignalR input binding `[SignalRConnectionInfoInput]`, negotiation in class-based model can be more flexible. Base class `ServerlessHub` has a method `NegotiateAsync`, which allows user to customize negotiation options such as `userId`, `claims`, etc.
129+
Instead of using SignalR input binding `[SignalRConnectionInfoInput]`, negotiation in class-based model can be more flexible. Base class `ServerlessHub` has a method `NegotiateAsync`, which allows users to customize negotiation options such as `userId`, `claims`, etc.
130130

131131
```cs
132132
Task<BinaryData> NegotiateAsync(NegotiationOptions? options = null)
@@ -141,7 +141,7 @@ You could send messages, manage groups, or manage clients by accessing the membe
141141
- `ServerlessHub.UserGroups` for managing users with groups, such as adding users to groups, removing users from groups.
142142
- `ServerlessHub.ClientManager` for checking connections existence, closing connections, etc.
143143

144-
### Strongly Typed Hub
144+
### Strongly typed Hub
145145

146146
[Strongly typed hub](/aspnet/core/signalr/hubs?#strongly-typed-hubs) allows you to use strongly typed methods when you send messages to clients. To use strongly typed hub in class based model, extract client methods into an interface `T`, and make your hub class derived from `ServerlessHub<T>`.
147147

@@ -158,7 +158,7 @@ Then you can use the strongly typed methods as follows:
158158
[SignalRConnection("AzureSignalRConnectionString")]
159159
public class Functions : ServerlessHub<IChatClient>
160160
{
161-
private const string HubName = nameof(Functions);
161+
private const string HubName = nameof(Functions); // Used by SignalR trigger only
162162
163163
public Functions(IServiceProvider serviceProvider) : base(serviceProvider)
164164
{
@@ -176,18 +176,18 @@ public class Functions : ServerlessHub<IChatClient>
176176
> [!NOTE]
177177
> You can get a complete project sample from [GitHub](https://github.com/aspnet/AzureSignalR-samples/tree/main/samples/DotnetIsolated-ClassBased/).
178178
179-
### Unified connection string setting in one place
179+
### Unified hub name and connection string setting in one place
180180

181-
You might have noticed the `SignalRConnection` attribute used on serverless hub classes. It looks like this:
182-
```cs
183-
[SignalRConnection("AzureSignalRConnectionString")]
184-
public class Functions : ServerlessHub<IChatClient>
185-
```
186-
187-
It allows you to customize where the SignalR Service bindings look for connection string. If it's absent, the default value `AzureSignalRConnectionString` is used.
181+
* The class name of the serverless hub is automatically used as `HubName`.
182+
* You might have noticed the `SignalRConnection` attribute used on serverless hub classes as follows:
183+
```cs
184+
[SignalRConnection("AzureSignalRConnectionString")]
185+
public class Functions : ServerlessHub<IChatClient>
186+
```
187+
It allows you to customize where the connection string for serverless hub is. If it's absent, the default value `AzureSignalRConnectionString` is used.
188188

189189
> [!IMPORTANT]
190-
> `SignalRConnection` attribute doesn't change the connection string setting of SignalR triggers, even though you use SignalR triggers inside the serverless hub. You should specify the connection string setting for each SignalR trigger if you want to customize it.
190+
> SignalR triggers and serverless hubs are independent. Therefore, the class name of serverless hub and `SignalRConnection` attribute doesn't change the settings of SignalR triggers, even though you use SignalR triggers inside the serverless hub.
191191

192192
# [In-process model](#tab/in-process)
193193

@@ -229,7 +229,7 @@ public class HubName1 : ServerlessHub
229229
}
230230
```
231231

232-
All functions that want to use the class-based model need to be a method of the class that inherits from **ServerlessHub**. The class name `SignalRTestHub` in the sample is the hub name.
232+
All functions that want to use the class-based model need to be a method of the class that inherits from **ServerlessHub**. The class name `HubName1` in the sample is the hub name.
233233

234234
### Define hub method
235235

@@ -250,13 +250,13 @@ In class based model, `[SignalRParameter]` is unnecessary because all the argume
250250

251251
### Negotiation experience in class-based model
252252

253-
Instead of using SignalR input binding `[SignalR]`, negotiation in class-based model can be more flexible. Base class `ServerlessHub` has a method.
253+
Instead of using SignalR input binding `[SignalR]`, negotiation in class-based model can be more flexible. Base class `ServerlessHub` has a method:
254254

255255
```cs
256256
SignalRConnectionInfo Negotiate(string userId = null, IList<Claim> claims = null, TimeSpan? lifeTime = null)
257257
```
258258

259-
This features user customizes `userId` or `claims` during the function execution.
259+
This feature allows user to customize `userId` or `claims` during the function execution.
260260

261261
## Use `SignalRFilterAttribute`
262262

articles/azure-web-pubsub/concept-azure-ad-authorization.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ Microsoft Entra authorizes access rights to secured resources through [Azure rol
4747

4848
Before assigning an Azure RBAC role to a security principal, it's important to identify the appropriate level of access that the principal should have. It's recommended to grant the role with the narrowest possible scope. Resources located underneath inherit Azure RBAC roles with broader scopes.
4949

50-
You can scope access to Azure SignalR resources at the following levels, beginning with the narrowest scope:
50+
You can scope access to Azure Web PubSub resources at the following levels, beginning with the narrowest scope:
5151

5252
- **An individual resource.**
5353

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
title: Device and permission issues - askDevicePermission API takes too long
3+
titleSuffix: Azure Communication Services - Troubleshooting Guide
4+
description: Learn how to troubleshoot when askDevicePermission API takes too long.
5+
author: enricohuang
6+
ms.author: enricohuang
7+
8+
services: azure-communication-services
9+
ms.date: 03/29/2024
10+
ms.topic: troubleshooting
11+
ms.service: azure-communication-services
12+
ms.subservice: calling
13+
---
14+
15+
# The askDevicePermission API takes too long
16+
The [`askDevicePermission`](/javascript/api/%40azure/communication-react/calladapterdevicemanagement?view=azure-node-latest&preserve-view=true#@azure-communication-react-calladapterdevicemanagement-askdevicepermission) API prompts the end user via the browser asking if they allow permission to use camera or microphone.
17+
If the end user approves camera or microphone usage, then those devices are available to be used in a call. The devices availability is reflected in available device list.
18+
19+
User taking a long time to approve the permission can cause delay in the API response.
20+
21+
Occasionally, the device list update step can take a long time.
22+
A delay in the driver layer is usually the cause of the issue. The issue can happen with some virtual audio devices in particular. [Chromium Issue 1402866](https://bugs.chromium.org/p/chromium/issues/detail?id=1402866&no_tracker_redirect=1)
23+
24+
## How to detect using the SDK
25+
To detect this issue, you can measure the time difference between when you call the [`askDevicePermission`](/javascript/api/%40azure/communication-react/calladapterdevicemanagement?view=azure-node-latest&preserve-view=true#@azure-communication-react-calladapterdevicemanagement-askdevicepermission) API and when the promise resolves or rejects.
26+
27+
## How to mitigate or resolve
28+
If the [`askDevicePermission`](/javascript/api/%40azure/communication-react/calladapterdevicemanagement?view=azure-node-latest&preserve-view=true#@azure-communication-react-calladapterdevicemanagement-askdevicepermission) API fails due to the user not responding to the UI permission prompt,
29+
the application can retry the API again and the user should see the UI permission prompt.
30+
31+
As for other reasons, such as the device list updating taking too long to complete, the user should check their devices and see if there's any device that could potentially be causing this issue.
32+
They may need to update or remove the problematic device to resolve the issue.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
---
2+
title: Device and permission issues - getMicrophones API doesn't return detailed microphone list
3+
titleSuffix: Azure Communication Services - Troubleshooting Guide
4+
description: Learn how to troubleshoot when getMicrophones API doesn't return detailed microphone list.
5+
author: enricohuang
6+
ms.author: enricohuang
7+
8+
services: azure-communication-services
9+
ms.date: 03/29/2024
10+
ms.topic: troubleshooting
11+
ms.service: azure-communication-services
12+
ms.subservice: calling
13+
---
14+
15+
# The getMicrophones API doesn't return detailed microphone list
16+
If a user reports they can't see the detailed microphone list,
17+
it's likely because the user didn't grant permission to access the microphone.
18+
When the permission state is `prompt` or `denied`, the browser doesn't provide detailed information about the microphone devices.
19+
In this scenario, the [`DeviceManager.getMicrophones`](/javascript/api/azure-communication-services/@azure/communication-calling/devicemanager?view=azure-communication-services-js&preserve-view=true#@azure-communication-calling-devicemanager-getmicrophones) API returns an array with one object, where the `id` is set to `microphone:` and the name is set to an empty string.
20+
21+
It's important to note that this scenario differs from the scenario where a user doesn't have any microphone on their device. If a device doesn't have any microphones the [`DeviceManager.getMicrophones`](/javascript/api/azure-communication-services/@azure/communication-calling/devicemanager?view=azure-communication-services-js&preserve-view=true#@azure-communication-calling-devicemanager-getmicrophones) API returns an empty array, indicating that there's no available microphone devices on the user's system.
22+
23+
## How to detect using the SDK
24+
[`DeviceManager.getMicrophones`](/javascript/api/azure-communication-services/@azure/communication-calling/devicemanager?view=azure-communication-services-js&preserve-view=true#@azure-communication-calling-devicemanager-getmicrophones) API returns an empty array or an array with an object, where the `id` is set to `microphone:` and the name is set to an empty string.
25+
26+
Additionally, to detect the scenario where the user removes the microphone during the call and there are no available microphones in the system,
27+
the application can listen to the [`noMicrophoneDevicesEnumerated`](/javascript/api/azure-communication-services/@azure/communication-calling/latestmediadiagnostics?view=azure-communication-services-js&preserve-view=true#@azure-communication-calling-latestmediadiagnostics-nomicrophonedevicesenumerated) event being raised to true in the [User Facing Diagnostics Feature](../../../../concepts/voice-video-calling/user-facing-diagnostics.md).
28+
This event can help the application understand the current situation, so it can show a warning message on its UI accordingly.
29+
30+
## How to mitigate or resolve
31+
Your application should always call the [`DeviceManager.askDevicePermission`](/javascript/api/azure-communication-services/@azure/communication-calling/devicemanager?view=azure-communication-services-js&preserve-view=true#@azure-communication-calling-devicemanager-askdevicepermission) API to ensure that the required permissions are granted.
32+
If the user doesn't grant the microphone permission, your application should display a warning message on its user interface.
33+
34+
Additionally, your application should listen to the [`noMicrophoneDevicesEnumerated`](/javascript/api/azure-communication-services/@azure/communication-calling/latestmediadiagnostics?view=azure-communication-services-js&preserve-view=true#@azure-communication-calling-latestmediadiagnostics-nomicrophonedevicesenumerated) event and show a message when there are no available microphone devices.
35+
If the application provides a device selection page before the call,
36+
it can also check whether the microphone list is empty and shows a warning accordingly indicating no mic devices available.

0 commit comments

Comments
 (0)