Skip to content

Commit d1e6456

Browse files
committed
Merge branch 'main' into release-aio-2603
2 parents 3cfaa64 + 70b0c1e commit d1e6456

100 files changed

Lines changed: 1985 additions & 1514 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

articles/api-management/private-endpoint.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ ms.service: azure-api-management
55
author: dlepow
66
ms.author: danlep
77
ms.topic: how-to
8-
ms.date: 11/17/2025
8+
ms.date: 03/17/2026
99
ms.custom:
1010
- build-2025
1111
- sfi-image-nochange
@@ -32,7 +32,9 @@ You can configure an inbound [private endpoint](../private-link/private-endpoint
3232
* Only the API Management instance's **Gateway endpoint** supports inbound Private Link connections.
3333
* Each API Management instance supports at most 100 Private Link connections.
3434
* Connections aren't supported on the [self-hosted gateway](self-hosted-gateway-overview.md) or on a [workspace gateway](workspaces-overview.md#workspace-gateway).
35-
* In the classic API Management tiers, private endpoints aren't supported in instances injected in an internal or external virtual network.
35+
* In the classic API Management tiers, private endpoints aren't supported in instances injected in an internal or external virtual network.
36+
> [!NOTE]
37+
> In the Standard v2 and Premium v2 tiers, private endpoints are supported in instances with any supported virtual network configuration when fronted with [Azure Front Door Premium](../frontdoor/standard-premium/how-to-enable-private-link-apim.md).
3638
3739
## Typical scenarios
3840

@@ -43,9 +45,6 @@ Supported configurations include:
4345
* Pass client requests through a firewall and configure rules to route requests privately to the API Management gateway.
4446
* Configure Azure Front Door (or Azure Front Door with Azure Application Gateway) to receive external traffic and then route traffic privately to the API Management gateway. For example, see [Connect Azure Front Door Premium to an Azure API Management with Private Link](../frontdoor/standard-premium/how-to-enable-private-link-apim.md).
4547

46-
> [!NOTE]
47-
> Currently, routing traffic privately from Azure Front Door to an API Management Premium v2 instance isn't supported.
48-
4948
## Prerequisites
5049

5150
- An existing API Management instance. [Create one if you haven't already](get-started-create-service-instance.md).

articles/application-gateway/ipv6-application-gateway-portal.md

Lines changed: 64 additions & 60 deletions
Large diffs are not rendered by default.

articles/application-gateway/mutual-authentication-arm-template.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,4 +388,4 @@ az deployment group create \
388388

389389
## Security notice
390390

391-
This solution is classified as **Microsoft Confidential**. Please ensure you follow your organization’s security and data handling best practices when deploying and managing this solution.
391+
Please ensure you follow your organization’s security and data handling best practices when deploying and managing this solution.

articles/azure-functions/durable/durable-functions-diagnostics.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,32 @@ module.exports = df.orchestrator(function*(context){
240240
});
241241
```
242242

243+
<br>
244+
<details>
245+
<summary><b>Node.js programming model v4 apps (including TypeScript)</b></summary>
246+
247+
Use the same replay check pattern in your orchestration function:
248+
249+
```typescript
250+
import * as df from "durable-functions";
251+
252+
df.app.orchestration("FunctionChain", function* (context) {
253+
if (!context.df.isReplaying) context.log("Calling F1.");
254+
yield context.df.callActivity("F1");
255+
if (!context.df.isReplaying) context.log("Calling F2.");
256+
yield context.df.callActivity("F2");
257+
if (!context.df.isReplaying) context.log("Calling F3.");
258+
yield context.df.callActivity("F3");
259+
context.log("Done!");
260+
});
261+
```
262+
263+
> [!NOTE]
264+
> The `isReplaying` check suppresses duplicate logs caused by orchestrator replay. It doesn't suppress duplicate logs caused by full re-execution (for example, host restarts, long local debugging sessions, or queue message visibility timeouts). In those cases, you might still see repeated log lines with the same orchestration instance ID.
265+
266+
</details>
267+
<br>
268+
243269
# [Python](#tab/python)
244270

245271
```python
@@ -377,6 +403,25 @@ module.exports = df.orchestrator(function*(context){
377403
});
378404
```
379405

406+
<details>
407+
<summary><b>Node.js programming model v4 apps (including TypeScript)</b></summary>
408+
409+
```typescript
410+
import * as df from "durable-functions";
411+
412+
df.app.orchestration("FunctionChain", function* (context) {
413+
if (!context.df.isReplaying) context.log("Calling F1.");
414+
yield context.df.callActivity("F1");
415+
if (!context.df.isReplaying) context.log("Calling F2.");
416+
yield context.df.callActivity("F2");
417+
if (!context.df.isReplaying) context.log("Calling F3.");
418+
yield context.df.callActivity("F3");
419+
context.log("Done!");
420+
});
421+
```
422+
423+
</details>
424+
380425
# [Python](#tab/python)
381426

382427
```python
@@ -484,6 +529,25 @@ module.exports = df.orchestrator(function*(context) {
484529
});
485530
```
486531

532+
<details>
533+
<summary><b>Node.js programming model v4 apps (including TypeScript)</b></summary>
534+
535+
```typescript
536+
import * as df from "durable-functions";
537+
538+
df.app.orchestration("SetStatusTest", function* (context) {
539+
// ...do work...
540+
541+
// update the status of the orchestration with some arbitrary data
542+
const customStatus = { completionPercentage: 90.0, status: "Updating database records" };
543+
context.df.setCustomStatus(customStatus);
544+
545+
// ...do more work...
546+
});
547+
```
548+
549+
</details>
550+
487551
# [Python](#tab/python)
488552

489553
```python

articles/azure-functions/durable/durable-functions-fan-in-fan-out.md

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,55 @@ Here is the code that implements the orchestrator function:
9292

9393
[!code-csharp[Main](~/samples-durable-functions/samples/precompiled/BackupSiteContent.cs?range=16-42)]
9494

95+
> [!NOTE]
96+
> The sample linked in the prerequisites (`samples/precompiled`) uses the in-process model. The following **Isolated model** sections show equivalent code for the .NET isolated worker model.
97+
9598
Notice the `await Task.WhenAll(tasks);` line. The code doesn't await the individual calls to `E2_CopyFileToBlob`, so they run in parallel. When the orchestrator passes the task array to `Task.WhenAll`, it returns a task that doesn't complete until all copy operations complete. If you're familiar with the Task Parallel Library (TPL) in .NET, this pattern is familiar. The difference is that these tasks could be running on multiple virtual machines concurrently, and the Durable Functions extension ensures that the end-to-end execution is resilient to process recycling.
9699

97100
After the orchestrator awaits `Task.WhenAll`, all function calls are complete and return values. Each call to `E2_CopyFileToBlob` returns the number of bytes uploaded. Calculate the total by adding the return values.
98101

102+
<br>
103+
104+
<details>
105+
<summary><b>Isolated model</b></summary>
106+
107+
```csharp
108+
using System.IO;
109+
using System.Linq;
110+
using System.Threading.Tasks;
111+
using Microsoft.Azure.Functions.Worker;
112+
using Microsoft.DurableTask;
113+
114+
namespace SampleApp;
115+
116+
public static class BackupSiteContent
117+
{
118+
[Function("E2_BackupSiteContent")]
119+
public static async Task<long> Run(
120+
[OrchestrationTrigger] TaskOrchestrationContext context)
121+
{
122+
string rootDirectory = context.GetInput<string>()?.Trim();
123+
if (string.IsNullOrEmpty(rootDirectory))
124+
{
125+
rootDirectory = Directory.GetParent(typeof(BackupSiteContent).Assembly.Location)!.FullName;
126+
}
127+
128+
string[] files = await context.CallActivityAsync<string[]>("E2_GetFileList", rootDirectory);
129+
130+
Task<long>[] tasks = files
131+
.Select(file => context.CallActivityAsync<long>("E2_CopyFileToBlob", file))
132+
.ToArray();
133+
134+
long[] results = await Task.WhenAll(tasks);
135+
return results.Sum();
136+
}
137+
}
138+
```
139+
140+
</details>
141+
142+
<br>
143+
99144
# [JavaScript](#tab/javascript)
100145

101146
<details>
@@ -321,6 +366,40 @@ The helper activity functions are regular functions that use the `activityTrigge
321366

322367
[!code-csharp[Main](~/samples-durable-functions/samples/precompiled/BackupSiteContent.cs?range=44-54)]
323368

369+
<br>
370+
371+
<details>
372+
<summary><b>Isolated model</b></summary>
373+
374+
```csharp
375+
using System.IO;
376+
using Microsoft.Azure.Functions.Worker;
377+
using Microsoft.Extensions.Logging;
378+
379+
namespace SampleApp;
380+
381+
public static class BackupSiteContent
382+
{
383+
[Function("E2_GetFileList")]
384+
public static string[] GetFileList(
385+
[ActivityTrigger] string rootDirectory,
386+
FunctionContext executionContext)
387+
{
388+
ILogger logger = executionContext.GetLogger("E2_GetFileList");
389+
logger.LogInformation("Searching for files under '{RootDirectory}'...", rootDirectory);
390+
391+
string[] files = Directory.GetFiles(rootDirectory, "*", SearchOption.AllDirectories);
392+
logger.LogInformation("Found {FileCount} file(s) under {RootDirectory}.", files.Length, rootDirectory);
393+
394+
return files;
395+
}
396+
}
397+
```
398+
399+
</details>
400+
401+
<br>
402+
324403
# [JavaScript](#tab/javascript)
325404

326405
<details>
@@ -385,6 +464,60 @@ Java sample coming soon.
385464
386465
The function uses Azure Functions binding features like the [`Binder` parameter](../functions-dotnet-class-library.md#binding-at-runtime). You don't need those details for this walkthrough.
387466

467+
<br>
468+
469+
<details>
470+
<summary><b>Isolated model</b></summary>
471+
472+
```csharp
473+
using System;
474+
using System.IO;
475+
using System.Threading.Tasks;
476+
using Azure.Storage.Blobs;
477+
using Microsoft.Azure.Functions.Worker;
478+
using Microsoft.Extensions.Logging;
479+
480+
namespace SampleApp;
481+
482+
public static class BackupSiteContent
483+
{
484+
[Function("E2_CopyFileToBlob")]
485+
public static async Task<long> CopyFileToBlob(
486+
[ActivityTrigger] string filePath,
487+
FunctionContext executionContext)
488+
{
489+
ILogger logger = executionContext.GetLogger("E2_CopyFileToBlob");
490+
long byteCount = new FileInfo(filePath).Length;
491+
492+
string blobPath = filePath
493+
.Substring(Path.GetPathRoot(filePath)!.Length)
494+
.Replace('\\', '/');
495+
string outputLocation = $"backups/{blobPath}";
496+
497+
string? connectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage");
498+
if (string.IsNullOrEmpty(connectionString))
499+
{
500+
throw new InvalidOperationException("AzureWebJobsStorage is not configured.");
501+
}
502+
503+
BlobContainerClient containerClient = new(connectionString, "backups");
504+
await containerClient.CreateIfNotExistsAsync();
505+
BlobClient blobClient = containerClient.GetBlobClient(blobPath);
506+
507+
logger.LogInformation("Copying '{FilePath}' to '{OutputLocation}'. Total bytes = {ByteCount}.", filePath, outputLocation, byteCount);
508+
509+
await using Stream source = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
510+
await blobClient.UploadAsync(source, overwrite: true);
511+
512+
return byteCount;
513+
}
514+
}
515+
```
516+
517+
</details>
518+
519+
<br>
520+
388521
# [JavaScript](#tab/javascript)
389522

390523
<details>

articles/azure-functions/durable/durable-functions-isolated-create-first-csharp.md

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ To complete this quickstart, you need:
3737

3838
* An Azure subscription. To use Durable Functions, you must have an Azure Storage account.
3939

40-
* [.NET Core SDK](https://dotnet.microsoft.com/download) version 3.1 or later installed.
40+
* [.NET SDK](https://dotnet.microsoft.com/download) version 8.0 or later installed.
4141

4242
* An HTTP test tool that keeps your data secure. For more information, see [HTTP test tools](../functions-develop-local.md#http-test-tools).
4343

@@ -70,6 +70,16 @@ In Visual Studio Code, create a local Azure Functions project.
7070

7171
Visual Studio Code installs Azure Functions Core Tools if it's required to create the project. It also creates a function app project in a folder. This project contains the [host.json](../functions-host-json.md) and [local.settings.json](../functions-develop-local.md#local-settings-file) configuration files.
7272

73+
If you don't see **C#** in the language list or if only *function.json* is generated, verify the following prerequisites and then create the project again in a new empty folder:
74+
75+
* The latest [Azure Functions Core Tools](../functions-run-local.md) is installed.
76+
* A supported [.NET SDK](https://dotnet.microsoft.com/download) is installed.
77+
* The [C# extension](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp) is installed in Visual Studio Code.
78+
79+
These checks usually resolve cases where Visual Studio Code scaffolds only metadata instead of generating the C# project files.
80+
81+
For more troubleshooting steps, see the [Azure Functions Core Tools reference](../functions-core-tools-reference.md).
82+
7383
Another file, *HelloOrchestration.cs*, contains the basic building blocks of a Durable Functions app:
7484

7585
| Method | Description |
@@ -100,7 +110,7 @@ You can use other storage options for your Durable Functions app. For more infor
100110

101111
## Test the function locally
102112

103-
Azure Functions Core Tools gives you the capability to run an Azure Functions project on your local development computer. You're prompted to install these tools the first time you start a function in Visual Studio Code.
113+
Azure Functions Core Tools gives you the capability to run an Azure Functions project on your local development computer. You're prompted to install these tools the first time you start a function in Visual Studio.
104114

105115
1. In Visual Studio Code, set a breakpoint in the `SayHello` activity function code, and then select F5 to start the function app project. The terminal panel displays output from Core Tools.
106116

@@ -228,7 +238,7 @@ For more information about these functions, see [Durable Functions types and fea
228238

229239
Azure Functions Core Tools gives you the capability to run an Azure Functions project on your local development computer. You're prompted to install these tools the first time you start a function in Visual Studio Code.
230240

231-
1. In Visual Studio Code, set a breakpoint in the `SayHello` activity function code, and then select F5. If you're prompted, accept the request from Visual Studio to download and install Azure Functions Core (command-line) tools. You might also need to enable a firewall exception so that the tools can handle HTTP requests.
241+
1. In Visual Studio, set a breakpoint in the `SayHello` activity function code, and then select F5. If you're prompted, accept the request from Visual Studio to download and install Azure Functions Core (command-line) tools. You might also need to enable a firewall exception so that the tools can handle HTTP requests.
232242

233243
> [!NOTE]
234244
> For more information about debugging, see [Durable Functions diagnostics](durable-functions-diagnostics.md#debugging).

0 commit comments

Comments
 (0)