diff --git a/docs/ai/azure-ai-services-authentication.md b/docs/ai/azure-ai-services-authentication.md index 1c9a5075ff0ef..09bf81468d5d8 100644 --- a/docs/ai/azure-ai-services-authentication.md +++ b/docs/ai/azure-ai-services-authentication.md @@ -4,6 +4,7 @@ description: Learn about the different options to authenticate to Azure OpenAI a author: alexwolfmsft ms.topic: concept-article ms.date: 03/06/2026 +ai-usage: ai-assisted --- # Foundry tools authentication and authorization using .NET @@ -34,10 +35,10 @@ builder.Services.AddAzureOpenAIChatCompletion( var kernel = builder.Build(); ``` -Using keys is a straightforward option, but this approach should be used with caution. Keys aren't the recommended authentication option because they: +Keys are straightforward to use, but treat them with caution. Keys aren't the recommended authentication option because they: - Don't follow [the principle of least privilege](/entra/identity-platform/secure-least-privileged-access). They provide elevated permissions regardless of who uses them or for what task. -- Can accidentally be checked into source control or stored in unsafe locations. +- Can accidentally end up in source control or unsafe storage locations. - Can easily be shared with or sent to parties who shouldn't have access. - Often require manual administration and rotation. @@ -49,7 +50,7 @@ Microsoft Entra ID is a cloud-based identity and access management service that - Keyless authentication using [identities](/entra/fundamentals/identity-fundamental-concepts). - Role-based access control (RBAC) to assign identities the minimum required permissions. -- Can use the [`Azure.Identity`](/dotnet/api/overview/azure/identity-readme) client library to detect [different credentials across environments](/dotnet/api/azure.identity.defaultazurecredential) without requiring code changes. +- Lets you use the [`Azure.Identity`](/dotnet/api/overview/azure/identity-readme) client library to detect [different credentials across environments](/dotnet/api/azure.identity.defaultazurecredential) without requiring code changes. - Automatically handles administrative maintenance tasks such as rotating underlying keys. The workflow to implement Microsoft Entra authentication in your app generally includes the following steps: @@ -80,7 +81,7 @@ az login ### Configure the app code -Use the [`Azure.Identity`](/dotnet/api/overview/azure/identity-readme) client library from the Azure SDK to implement Microsoft Entra authentication in your code. The `Azure.Identity` libraries include the `DefaultAzureCredential` class, which automatically discovers available Azure credentials based on the current environment and tooling available. For the full set of supported environment credentials and the order in which they are searched, see the [Azure SDK for .NET](/dotnet/api/azure.identity.defaultazurecredential) documentation. +Use the [`Azure.Identity`](/dotnet/api/overview/azure/identity-readme) client library from the Azure SDK to implement Microsoft Entra authentication in your code. The `Azure.Identity` libraries include the `DefaultAzureCredential` class, which automatically discovers available Azure credentials based on the current environment and tooling available. For the full set of supported environment credentials and the order in which `DefaultAzureCredential` searches them, see the [Azure SDK for .NET](/dotnet/api/azure.identity.defaultazurecredential) documentation. For example, configure Azure OpenAI to authenticate using `DefaultAzureCredential` using the following code: @@ -125,7 +126,7 @@ There are two types of managed identities you can assign to your app: - A **system-assigned identity** is tied to your application and is deleted if your app is deleted. An app can only have one system-assigned identity. - A **user-assigned identity** is a standalone Azure resource that can be assigned to your app. An app can have multiple user-assigned identities. -Assign roles to a managed identity just like you would an individual user account, such as the **Cognitive Services OpenAI User** role. learn more about working with managed identities using the following resources: +Assign roles to a managed identity just like you would an individual user account, such as the **Cognitive Services OpenAI User** role. Learn more about working with managed identities using the following resources: - [Managed identities overview](/entra/identity/managed-identities-azure-resources/overview) - [Authenticate App Service to Azure OpenAI using Microsoft Entra ID](/dotnet/ai/how-to/app-service-aoai-auth?pivots=azure-portal) diff --git a/docs/ai/conceptual/chain-of-thought-prompting.md b/docs/ai/conceptual/chain-of-thought-prompting.md index 962675228c0f7..a87e028d551c0 100644 --- a/docs/ai/conceptual/chain-of-thought-prompting.md +++ b/docs/ai/conceptual/chain-of-thought-prompting.md @@ -1,8 +1,9 @@ --- -title: "Chain of Thought Prompting - .NET" +title: "Chain of thought prompting - .NET" description: "Learn how chain of thought prompting can simplify prompt engineering." ms.topic: concept-article #Don't change. -ms.date: 05/29/2025 +ms.date: 03/04/2026 +ai-usage: ai-assisted #customer intent: As a .NET developer, I want to understand what chain-of-thought prompting is and how it can help me save time and get better completions out of prompt engineering. @@ -10,11 +11,11 @@ ms.date: 05/29/2025 # Chain of thought prompting -GPT model performance and response quality benefits from *prompt engineering*, which is the practice of providing instructions and examples to a model to prime or refine its output. As they process instructions, models make more reasoning errors when they try to answer right away rather than taking time to work out an answer. You can help the model reason its way toward correct answers more reliably by asking for the model to include its chain of thought—that is, the steps it took to follow an instruction, along with the results of each step. +GPT model performance and response quality benefit from *prompt engineering*, which is the practice of providing instructions and examples to a model to prime or refine its output. As they process instructions, models make more reasoning errors when they try to answer right away rather than taking time to work out an answer. Help the model reason its way toward correct answers more reliably by asking the model to include its chain of thought—that is, the steps it took to follow an instruction, along with the results of each step. *Chain of thought prompting* is the practice of prompting a model to perform a task step-by-step and to present each step and its result in order in the output. This simplifies prompt engineering by offloading some execution planning to the model, and makes it easier to connect any problem to a specific step so you know where to focus further efforts. -It's generally simpler to just instruct the model to include its chain of thought, but you can use examples to show the model how to break down tasks. The following sections show both ways. +It's generally simpler to instruct the model to include its chain of thought, but you can also use examples to show the model how to break down tasks. The following sections show both ways. ## Use chain of thought prompting in instructions @@ -27,7 +28,7 @@ Break the task into steps, and output the result of each step as you perform it. ## Use chain of thought prompting in examples -You can use examples to indicate the steps for chain of thought prompting, which the model will interpret to mean it should also output step results. Steps can include formatting cues. +Use examples to indicate the steps for chain of thought prompting, which the model interprets to mean it should also output step results. Steps can include formatting cues. ```csharp prompt= """ diff --git a/docs/ai/conceptual/embeddings.md b/docs/ai/conceptual/embeddings.md index 4f1f0f206b0be..19fd89971d1e8 100644 --- a/docs/ai/conceptual/embeddings.md +++ b/docs/ai/conceptual/embeddings.md @@ -2,19 +2,18 @@ title: "How Embeddings Extend Your AI Model's Reach" description: "Learn how embeddings extend the limits and capabilities of AI models in .NET." ms.topic: concept-article #Don't change. -ms.date: 05/29/2025 +ms.date: 03/04/2026 +ai-usage: ai-assisted #customer intent: As a .NET developer, I want to understand how embeddings extend LLM limits and capabilities in .NET so that I have more semantic context and better outcomes for my AI apps. --- # Embeddings in .NET -Embeddings are the way LLMs capture semantic meaning. They are numeric representations of non-numeric data that an LLM can use to determine relationships between concepts. You can use embeddings to help an AI model understand the meaning of inputs so that it can perform comparisons and transformations, such as summarizing text or creating images from text descriptions. LLMs can use embeddings immediately, and you can store embeddings in vector databases to provide semantic memory for LLMs as-needed. +Embeddings are the way LLMs capture semantic meaning. They're numeric representations of non-numeric data that an LLM can use to determine relationships between concepts. Use embeddings to help an AI model understand the meaning of inputs so that it can perform comparisons and transformations, such as summarizing text or creating images from text descriptions. LLMs can use embeddings immediately, and you can store embeddings in vector databases to provide semantic memory for LLMs as needed. ## Use cases for embeddings -This section lists the main use cases for embeddings. - ### Use your own data to improve completion relevance Use your own databases to generate embeddings for your data and integrate it with an LLM to make it available for completions. This use of embeddings is an important component of [retrieval-augmented generation](rag.md). @@ -23,7 +22,7 @@ Use your own databases to generate embeddings for your data and integrate it wit Use embeddings to increase the amount of context you can fit in a prompt without increasing the number of tokens required. -For example, suppose you want to include 500 pages of text in a prompt. The number of tokens for that much raw text will exceed the input token limit, making it impossible to directly include in a prompt. You can use embeddings to summarize and break down large amounts of that text into pieces that are small enough to fit in one input, and then assess the similarity of each piece to the entire raw text. Then you can choose a piece that best preserves the semantic meaning of the raw text and use it in your prompt without hitting the token limit. +For example, suppose you want to include 500 pages of text in a prompt. The number of tokens for that much raw text exceeds the input token limit, making it impossible to directly include in a prompt. You can use embeddings to summarize and break down large amounts of that text into pieces that are small enough to fit in one input, and then assess the similarity of each piece to the entire raw text. Then you can choose a piece that best preserves the semantic meaning of the raw text and use it in your prompt without hitting the token limit. ### Perform text classification, summarization, or translation @@ -45,11 +44,11 @@ Use embeddings to help a model create code from text or vice versa, by convertin ## Choose an embedding model -You generate embeddings for your raw data by using an AI embedding model, which can encode non-numeric data into a vector (a long array of numbers). The model can also decode an embedding into non-numeric data that has the same or similar meaning as the original, raw data. There are many embedding models available for you to use, with OpenAI's `text-embedding-ada-002` model being one of the common models that's used. For more examples, see the list of [Embedding models available on Azure OpenAI](/azure/ai-services/openai/concepts/models#embeddings). +You generate embeddings for your raw data by using an AI embedding model, which can encode non-numeric data into a vector (a long array of numbers). The model can also decode an embedding into non-numeric data that has the same or similar meaning as the original, raw data. OpenAI's `text-embedding-3-small` and `text-embedding-3-large` are the currently recommended embedding models, replacing the older `text-embedding-ada-002`. For more examples, see the list of [Embedding models available on Azure OpenAI](/azure/ai-services/openai/concepts/models#embeddings). ### Store and process embeddings in a vector database -After you generate embeddings, you'll need a way to store them so you can later retrieve them with calls to an LLM. Vector databases are designed to store and process vectors, so they're a natural home for embeddings. Different vector databases offer different processing capabilities, so you should choose one based on your raw data and your goals. For information about your options, see [Vector databases for .NET + AI](vector-databases.md). +After you generate embeddings, you need a way to store them so you can later retrieve them with calls to an LLM. Vector databases are designed to store and process vectors, so they're a natural home for embeddings. Different vector databases offer different processing capabilities. Choose one based on your raw data and your goals. For information about your options, see [Vector databases for .NET + AI](vector-databases.md). ### Using embeddings in your LLM solution diff --git a/docs/ai/conceptual/how-genai-and-llms-work.md b/docs/ai/conceptual/how-genai-and-llms-work.md index 07836925dd593..09e080a5fe71b 100644 --- a/docs/ai/conceptual/how-genai-and-llms-work.md +++ b/docs/ai/conceptual/how-genai-and-llms-work.md @@ -2,7 +2,8 @@ title: "How Generative AI and LLMs work" description: "Understand how Generative AI and large language models (LLMs) work and how they might be useful in your .NET projects." ms.topic: concept-article -ms.date: 05/29/2025 +ms.date: 03/04/2026 +ai-usage: ai-assisted #customer intent: As a .NET developer, I want to understand how Generative AI and large language models (LLMs) work and how they may be useful in my .NET projects. @@ -10,19 +11,19 @@ ms.date: 05/29/2025 # How generative AI and LLMs work -Generative AI is a type of artificial intelligence capable of creating original content, such as natural language, images, audio, and code. The output of a generative AI is based on the inputs provided by the user. One common way for users to interact with generative AI is through chat applications that use natural language as their input. ChatGPT, developed by OpenAI, is a popular example of this. Generative AI applications that use natural language as an input are powered by large language models (LLMs) to perform natural language processing (NLP). +Generative AI is a type of artificial intelligence that can create original content, such as natural language, images, audio, and code. The output depends on the inputs you provide. Users commonly interact with generative AI through chat applications that use natural language as input. ChatGPT, developed by OpenAI, is a popular example. Generative AI applications that use natural language as input are powered by large language models (LLMs) to perform natural language processing (NLP). ## How generative AI works -All generative AI is built on top of models. These models are trained with large sets of data in the form of content, such as natural language, images, audio, and code. Generative AI models use the patterns identified in the training data to produce new, statistically similar content. +All generative AI is built on models. These models are trained with large sets of data in the form of content, such as natural language, images, audio, and code. Generative AI models use the patterns identified in the training data to produce new, statistically similar content. -The input provided by the user is used by the AI model to build an output. The input is first parsed into a form of data that the model can understand. The model then uses that data to identify matching patterns from its training that it combines to build the final output. Generative AI models are designed to produce unique content, so they won't generate the same output for identical inputs. +The AI model uses your input to build an output. The model first parses the input into a form it can understand. The model then uses that data to identify matching patterns from its training that it combines to build the final output. Generative AI models are designed to produce unique content, so they won't generate the same output for identical inputs. -Generative AI applications that support natural language as an input or output utilize LLMs to do so. The LLM is used to perform NLP, which classifies the input text and determines its sentiment. That classification and sentiment analysis is used by the generative AI model to identify patterns and build the output. If the output is text, the LLM alone can be used to generate it. If the output is audio or images, additional models are used to provide the data and patterns for generating outputs in that format. +Generative AI applications that support natural language as input or output use LLMs to do so. The LLM performs NLP, which classifies the input text and determines its sentiment. The generative AI model uses that classification and sentiment analysis to identify patterns and build the output. If the output is text, the LLM alone generates it. If the output is audio or images, additional models provide the data and patterns for generating outputs in that format. ## Common uses of generative AI -Generative AI applications support a variety of potential use cases and potential outputs, which are explored in the following sections. +Generative AI applications support a variety of use cases and outputs, described in the following sections. ### Natural language generation @@ -50,7 +51,7 @@ Some generative AI applications produce image outputs from natural language inpu - The artistic style to create the image in - References for generating similar images -Image generation can create virtual avatars for online accounts, design logos for a business, or provide artistic inspiration for creators. For example, a user may input the request, *Create an image of an elephant eating a burger*. A generative AI application might produce the following output: +Image generation can create virtual avatars for online accounts, design logos for a business, or provide artistic inspiration for creators. For example, a user might input the request, *Create an image of an elephant eating a burger*. A generative AI application might produce the following output: :::image type="content" source="../media/how-genai-and-llms-work/generated-image.png" lightbox="../media/how-genai-and-llms-work/generated-image.png" alt-text="Example AI generated image of an elephant eating a hamburger."::: @@ -60,7 +61,7 @@ Some generative AI applications produce audio outputs from natural language inpu - Synthesize natural sounding voices from input text - Create music in a specific style or featuring certain instruments -- Modify input audio files based on a set criteria provided in natural language +- Modify input audio files based on set criteria provided in natural language Audio generation can provide spoken responses from digital voice assistants, add backing instruments to songs for music production, or reproduce a user's original voice from reference recordings. @@ -115,11 +116,11 @@ When training an LLM, the training text is first broken down into [tokens](under After the text has been broken down into tokens, a contextual vector, known as an [embedding](embeddings.md), is assigned to each token. These embedding vectors are multi-valued numeric data where each element of a token's vector represents a semantic attribute of the token. The elements of a token's vector are determined based on how commonly tokens are used together or in similar contexts. -The goal is to predict the next token in the sequence based on the preceding tokens. A weight is assigned to each token in the existing sequence that represents its relative influence on the next token. A calculation is then performed that uses the preceding tokens' weights and embeddings to predict the next vector value. The model then selects the most probable token to continue the sequence based on the predicted vector. +The goal is to predict the next token in the sequence based on the preceding tokens. The model assigns a weight to each token in the existing sequence, representing its relative influence on the next token. The model then uses the preceding tokens' weights and embeddings to calculate and predict the next vector value. The model then selects the most probable token to continue the sequence based on the predicted vector. This process continues iteratively for each token in the sequence, with the output sequence being used regressively as the input for the next iteration. The output is built one token at a time. This strategy is analogous to how auto-complete works, where suggestions are based on what's been typed so far and updated with each new input. -During training, the complete sequence of tokens is known, but all tokens that come after the one currently being considered are ignored. The predicted value for the next token's vector is compared to the actual value and the loss is calculated. The weights are then incrementally adjusted to reduce the loss and improve the model. +During training, the model knows the complete token sequence but ignores all tokens after the one currently being considered. The model compares the predicted vector value to the actual value and calculates the loss. Training then incrementally adjusts the weights to reduce the loss and improve the model. ## Related content diff --git a/docs/ai/conceptual/prompt-engineering-dotnet.md b/docs/ai/conceptual/prompt-engineering-dotnet.md index d56e361853572..0c68e6a490c17 100644 --- a/docs/ai/conceptual/prompt-engineering-dotnet.md +++ b/docs/ai/conceptual/prompt-engineering-dotnet.md @@ -2,7 +2,8 @@ title: Prompt engineering concepts description: Learn basic prompt engineering concepts and how to implement them using .NET tools such as Microsoft Agent Framework. ms.topic: concept-article -ms.date: 02/05/2026 +ms.date: 03/04/2026 +ai-usage: ai-assisted --- # Prompt engineering in .NET @@ -30,18 +31,18 @@ An example is text that shows the model how to respond by providing sample user An example starts with a prompt and can optionally include a completion. A completion in an example doesn't have to include the verbatim response—it might just contain a formatted word, the first bullet in an unordered list, or something similar to indicate how each completion should start. -Examples are classified as [zero-shot learning](zero-shot-learning.md#zero-shot-learning) or [few-shot learning](zero-shot-learning.md#few-shot-learning) based on whether they contain verbatim completions. +Classify examples as [zero-shot learning](zero-shot-learning.md#zero-shot-learning) or [few-shot learning](zero-shot-learning.md#few-shot-learning) based on whether they contain verbatim completions. - **Zero-shot learning** examples include a prompt with no verbatim completion. This approach tests a model's responses without giving it example data output. Zero-shot prompts can have completions that include cues, such as indicating the model should output an ordered list by including **"1."** as the completion. - **Few-shot learning** examples include several pairs of prompts with verbatim completions. Few-shot learning can change the model's behavior by adding to its existing knowledge. ## Cues -A *cue* is text that conveys the desired structure or format of output. Like an instruction, a cue isn't processed by the model as if it were user input. Like an example, a cue shows the model what you want instead of telling it what to do. You can add as many cues as you want, so you can iterate to get the result you want. Cues are used with an instruction or an example and should be at the end of the prompt. +A *cue* is text that conveys the desired structure or format of output. Like an instruction, a cue isn't processed by the model as if it were user input. Like an example, a cue shows the model what you want instead of telling it what to do. Add as many cues as you want to iterate toward the result you want. Use cues with an instruction or an example, and place them at the end of the prompt. ## Example prompt using .NET -.NET provides various tools to prompt and chat with different AI models. You can use [Agent Framework](/agent-framework/) to connect to a wide variety of AI models and services. Agent Framework includes tools to create agents with system instructions and maintain conversation state across multiple turns. +.NET provides various tools to prompt and chat with different AI models. Use [Agent Framework](/agent-framework/) to connect to a wide variety of AI models and services. Agent Framework includes tools to create agents with system instructions and maintain conversation state across multiple turns. Consider the following code example: diff --git a/docs/ai/conceptual/understanding-tokens.md b/docs/ai/conceptual/understanding-tokens.md index 9d9e76d55af4b..fab157851fc8e 100644 --- a/docs/ai/conceptual/understanding-tokens.md +++ b/docs/ai/conceptual/understanding-tokens.md @@ -2,12 +2,13 @@ title: "Understanding tokens" description: "Understand how large language models (LLMs) use tokens to analyze semantic relationships and generate natural language outputs" ms.topic: concept-article -ms.date: 05/29/2025 +ms.date: 03/04/2026 +ai-usage: ai-assisted #customer intent: As a .NET developer, I want understand how large language models (LLMs) use tokens so I can add semantic analysis and text generation capabilities to my .NET projects. --- # Understand tokens -Tokens are words, character sets, or combinations of words and punctuation that are generated by large language models (LLMs) when they decompose text. Tokenization is the first step in training. The LLM analyzes the semantic relationships between tokens, such as how commonly they're used together or whether they're used in similar contexts. After training, the LLM uses those patterns and relationships to generate a sequence of output tokens based on the input sequence. +When you work with a large language model (LLM), text is first broken into units called *tokens*, which are words, character sets, or combinations of words and punctuation, by a tokenizer. During training, tokenization runs as the first step. The LLM analyzes the semantic relationships between tokens, such as how commonly they're used together or whether they're used in similar contexts. After training, the LLM uses those patterns and relationships to generate a sequence of output tokens based on the input sequence. ## Turn text into tokens @@ -41,18 +42,18 @@ The specific tokenization method varies by LLM. Common tokenization methods incl For example, the GPT models, developed by OpenAI, use a type of subword tokenization that's known as _Byte-Pair Encoding_ (BPE). OpenAI provides [a tool to visualize how text will be tokenized](https://platform.openai.com/tokenizer). -There are benefits and disadvantages to each tokenization method: +Each tokenization method has benefits and disadvantages: | Token size | Pros | Cons | |----------------------------------------------------|------|------| | Smaller tokens (character or subword tokenization) | - Enables the model to handle a wider range of inputs, such as unknown words, typos, or complex syntax.
- Might allow the vocabulary size to be reduced, requiring fewer memory resources. | - A given text is broken into more tokens, requiring additional computational resources while processing.
- Given a fixed token limit, the maximum size of the model's input and output is smaller. | -| Larger tokens (word tokenization) | - A given text is broken into fewer tokens, requiring fewer computational resources while processing.
- Given the same token limit, the maximum size of the model's input and output is larger. | - Might cause an increased vocabulary size, requiring more memory resources.
- Can limit the models ability to handle unknown words, typos, or complex syntax. | +| Larger tokens (word tokenization) | - A given text is broken into fewer tokens, requiring fewer computational resources while processing.
- Given the same token limit, the maximum size of the model's input and output is larger. | - Might cause an increased vocabulary size, requiring more memory resources.
- Can limit the model's ability to handle unknown words, typos, or complex syntax. | ## How LLMs use tokens After the LLM completes tokenization, it assigns an ID to each unique token. -Consider our example sentence: +Consider this example sentence: > `I heard a dog bark loudly at a cat` @@ -70,14 +71,14 @@ After the model uses a word tokenization method, it could assign token IDs as fo By assigning IDs, text can be represented as a sequence of token IDs. The example sentence would be represented as [1, 2, 3, 4, 5, 6, 7, 3, 8]. The sentence "`I heard a cat`" would be represented as [1, 2, 3, 8]. -As training continues, the model adds any new tokens in the training text to its vocabulary and assigns it an ID. For example: +As training continues, the model adds any new tokens in the training text to its vocabulary and assigns each one an ID. For example: - `meow` (9) - `run` (10) -The semantic relationships between the tokens can be analyzed by using these token ID sequences. Multi-valued numeric vectors, known as [embeddings](embeddings.md), are used to represent these relationships. An embedding is assigned to each token based on how commonly it's used together with, or in similar contexts to, the other tokens. +These token ID sequences reveal the semantic relationships between tokens. Multi-valued numeric vectors, known as [embeddings](embeddings.md), represent these relationships. The model assigns an embedding to each token based on how commonly it's used together with, or in similar contexts to, the other tokens. -After it's trained, a model can calculate an embedding for text that contains multiple tokens. The model tokenizes the text, then calculates an overall embeddings value based on the learned embeddings of the individual tokens. This technique can be used for semantic document searches or adding vector stores to an AI. +After it's trained, a model can calculate an embedding for text that contains multiple tokens. The model tokenizes the text, then calculates an overall embeddings value based on the learned embeddings of the individual tokens. Use this technique for semantic document searches or to add vector stores to an AI. During output generation, the model predicts a vector value for the next token in the sequence. The model then selects the next token from its vocabulary based on this vector value. In practice, the model calculates multiple vectors by using various elements of the previous tokens' embeddings. The model then evaluates all potential tokens from these vectors and selects the most probable one to continue the sequence. @@ -85,7 +86,7 @@ Output generation is an iterative operation. The model appends the predicted tok ### Token limits -LLMs have limitations regarding the maximum number of tokens that can be used as input or generated as output. This limitation often causes the input and output tokens to be combined into a maximum context window. Taken together, a model's token limit and tokenization method determine the maximum length of text that can be provided as input or generated as output. +LLMs have a maximum number of tokens for input and output. This limit is often expressed as a combined maximum _context window_ that covers both input and output tokens together. Taken together, a model's token limit and tokenization method determine the maximum length of text that can be provided as input or generated as output. For example, consider a model that has a maximum context window of 100 tokens. The model processes the example sentences as input text: @@ -97,9 +98,9 @@ By using a character-based tokenization method, the input is 34 tokens (includin ### Token-based pricing and rate limiting -Generative AI services often use token-based pricing. The cost of each request depends on the number of input and output tokens. The pricing might differ between input and output. For example, see [Azure OpenAI Service pricing](https://azure.microsoft.com/pricing/details/cognitive-services/openai-service/). +Generative AI services often use token-based pricing. The cost of each request depends on the number of input and output tokens. Pricing might differ between input and output. For example, see [Azure OpenAI Service pricing](https://azure.microsoft.com/pricing/details/cognitive-services/openai-service/). -Generative AI services might also be limited regarding the maximum number of tokens per minute (TPM). These rate limits can vary depending on the service region and LLM. For more information about specific regions, see [Azure OpenAI Service quotas and limits](/azure/ai-services/openai/quotas-limits#regional-quota-limits). +Generative AI services also enforce a maximum number of tokens per minute (TPM). These rate limits can vary depending on the service region and LLM. For more information about specific regions, see [Azure OpenAI Service quotas and limits](/azure/ai-services/openai/quotas-limits#regional-quota-limits). ## Related content diff --git a/docs/ai/conceptual/vector-databases.md b/docs/ai/conceptual/vector-databases.md index 2373efce66156..832945838decd 100644 --- a/docs/ai/conceptual/vector-databases.md +++ b/docs/ai/conceptual/vector-databases.md @@ -2,12 +2,13 @@ title: "Using Vector Databases to Extend LLM Capabilities" description: "Learn how vector databases extend LLM capabilities by storing and processing embeddings in .NET." ms.topic: concept-article -ms.date: 05/29/2025 +ms.date: 03/04/2026 +ai-usage: ai-assisted --- # Vector databases for .NET + AI -Vector databases are designed to store and manage vector [embeddings](embeddings.md). Embeddings are numeric representations of non-numeric data that preserve semantic meaning. Words, documents, images, audio, and other types of data can all be vectorized. You can use embeddings to help an AI model understand the meaning of inputs so that it can perform comparisons and transformations, such as summarizing text, finding contextually related data, or creating images from text descriptions. +Vector databases are designed to store and manage vector [embeddings](embeddings.md). Embeddings are numeric representations of non-numeric data that preserve semantic meaning. You can vectorize words, documents, images, audio, and other data types. Use embeddings to help an AI model understand the meaning of inputs so that it can perform comparisons and transformations, such as summarizing text, finding contextually related data, or creating images from text descriptions. For example, you can use a vector database to: @@ -19,26 +20,26 @@ For example, you can use a vector database to: ## Understand vector search -Vector databases provide vector search capabilities to find similar items based on their data characteristics rather than by exact matches on a property field. Vector search works by analyzing the vector representations of your data that you created using an AI embedding model such the [Azure OpenAI embedding models](/azure/ai-services/openai/concepts/models#embeddings-models). The search process measures the distance between the data vectors and your query vector. The data vectors that are closest to your query vector are the ones that are found to be most similar semantically. +Vector databases provide vector search capabilities to find similar items based on their data characteristics rather than by exact matches on a property field. Vector search works by analyzing the vector representations of your data that you created using an AI embedding model such as the [Azure OpenAI embedding models](/azure/ai-services/openai/concepts/models#embeddings-models). The search process measures the distance between the data vectors and your query vector. The data vectors that are closest to your query vector are the ones that are found to be most similar semantically. Some services such as [Azure Cosmos DB for MongoDB vCore](/azure/cosmos-db/mongodb/vcore/vector-search) provide native vector search capabilities for your data. Other databases can be enhanced with vector search by indexing the stored data using a service such as Azure AI Search, which can scan and index your data to provide vector search capabilities. ## Vector search workflows with .NET and OpenAI -Vector databases and their search features are especially useful in [RAG pattern](rag.md) workflows with Azure OpenAI. This pattern allows you to augment or enhance your AI model with additional semantically rich knowledge of your data. A common AI workflow using vector databases might include the following steps: +Vector databases and their search features are especially useful in [RAG pattern](rag.md) workflows with Azure OpenAI. This pattern lets you augment your AI model with additional semantically rich knowledge of your data. A common AI workflow using vector databases includes these steps: 1. Create embeddings for your data using an OpenAI embedding model. 1. Store and index the embeddings in a vector database or search service. 1. Convert user prompts from your application to embeddings. -1. Run a vector search across your data, comparing the user prompt embedding to the embeddings your database. -1. Use a language model such as GPT-35 or GPT-4 to assemble a user friendly completion from the vector search results. +1. Run a vector search across your data, comparing the user prompt embedding to the embeddings in your database. +1. Use a language model such as GPT-4o to assemble a user-friendly completion from the vector search results. Visit the [Implement Azure OpenAI with RAG using vector search in a .NET app](../tutorials/tutorial-ai-vector-search.md) tutorial for a hands-on example of this flow. Other benefits of the RAG pattern include: - Generate contextually relevant and accurate responses to user prompts from AI models. -- Overcome LLM tokens limits - the heavy lifting is done through the database vector search. +- Overcome LLM token limits—the database vector search does the heavy lifting. - Reduce the costs from frequent fine-tuning on updated data. ## Related content diff --git a/docs/ai/conceptual/zero-shot-learning.md b/docs/ai/conceptual/zero-shot-learning.md index 774dad0b84a50..55c10fd1d3d28 100644 --- a/docs/ai/conceptual/zero-shot-learning.md +++ b/docs/ai/conceptual/zero-shot-learning.md @@ -2,7 +2,8 @@ title: "Zero-shot and few-shot learning" description: "Learn the use cases for zero-shot and few-shot learning in prompt engineering." ms.topic: concept-article #Don't change. -ms.date: 05/29/2025 +ms.date: 03/04/2026 +ai-usage: ai-assisted #customer intent: As a .NET developer, I want to understand how zero-shot and few-shot learning techniques can help me improve my prompt engineering. @@ -30,14 +31,14 @@ Intent: """; ``` -There are two primary use cases for zero-shot learning: +Zero-shot learning has two primary use cases: -- **Work with fined-tuned LLMs** - Because it relies on the model's existing knowledge, zero-shot learning is not as resource-intensive as few-shot learning, and it works well with LLMs that have already been fine-tuned on instruction datasets. You might be able to rely solely on zero-shot learning and keep costs relatively low. -- **Establish performance baselines** - Zero-shot learning can help you simulate how your app would perform for actual users. This lets you evaluate various aspects of your model's current performance, such as accuracy or precision. In this case, you typically use zero-shot learning to establish a performance baseline and then experiment with few-shot learning to improve performance. +- **Work with fine-tuned LLMs** - Because it relies on the model's existing knowledge, zero-shot learning isn't as resource-intensive as few-shot learning, and it works well with LLMs that have already been fine-tuned on instruction datasets. You might be able to rely solely on zero-shot learning and keep costs relatively low. +- **Establish performance baselines** - Zero-shot learning can help you simulate how your app performs for actual users. This lets you evaluate various aspects of your model's current performance, such as accuracy or precision. In this case, you typically use zero-shot learning to establish a performance baseline and then experiment with few-shot learning to improve performance. ## Few-shot learning -Few-shot learning is the practice of passing prompts paired with verbatim completions (few-shot prompts) to show your model how to respond. Compared to zero-shot learning, this means few-shot learning produces more tokens and causes the model to update its knowledge, which can make few-shot learning more resource-intensive. However, few-shot learning also helps the model produce more relevant responses. +Few-shot learning is the practice of passing prompts paired with verbatim completions (few-shot prompts) to show your model how to respond. Compared to zero-shot learning, this means few-shot learning produces more tokens and causes the model to update its knowledge, which can make few-shot learning more resource-intensive. However, few-shot learning also helps the model produce more relevant responses. ```csharp prompt = $""" @@ -58,14 +59,14 @@ Intent: Few-shot learning has two primary use cases: -- **Tuning an LLM** - Because it can add to the model's knowledge, few-shot learning can improve a model's performance. It also causes the model to create more tokens than zero-shot learning does, which can eventually become prohibitively expensive or even infeasible. However, if your LLM isn't fined-tuned yet, you won't always get good performance with zero-shot prompts, and few-shot learning is warranted. +- **Tuning an LLM** - Because it can add to the model's knowledge, few-shot learning can improve a model's performance. It also causes the model to create more tokens than zero-shot learning does, which can eventually become prohibitively expensive or even infeasible. However, if your LLM isn't fine-tuned yet, you won't always get good performance with zero-shot prompts, and few-shot learning is warranted. - **Fixing performance issues** - You can use few-shot learning as a follow-up to zero-shot learning. In this case, you use zero-shot learning to establish a performance baseline, and then experiment with few-shot learning based on the zero-shot prompts you used. This lets you add to the model's knowledge after seeing how it currently responds, so you can iterate and improve performance while minimizing the number of tokens you introduce. ### Caveats - Example-based learning doesn't work well for complex reasoning tasks. However, adding instructions can help address this. -- Few-shot learning requires creating lengthy prompts. Prompts with large number of tokens can increase computation and latency. This typically means increased costs. There's also a limit to the length of the prompts. -- When you use several examples the model can learn false patterns, such as "Sentiments are twice as likely to be positive than negative." +- Few-shot learning requires creating lengthy prompts. Prompts with a large number of tokens can increase computation and latency. This typically means increased costs. There's also a limit to the length of the prompts. +- When you use several examples, the model can learn false patterns, such as "Sentiments are twice as likely to be positive than negative." ## Related content diff --git a/docs/ai/evaluation/evaluate-ai-response.md b/docs/ai/evaluation/evaluate-ai-response.md index 11fcac85d7cd2..5e03ffa86e80c 100644 --- a/docs/ai/evaluation/evaluate-ai-response.md +++ b/docs/ai/evaluation/evaluate-ai-response.md @@ -44,7 +44,7 @@ Complete the following steps to create an MSTest project that connects to an AI dotnet add package Microsoft.Extensions.Configuration.UserSecrets ``` -1. Run the following commands to add [app secrets](/aspnet/core/security/app-secrets) for your Azure OpenAI endpoint, model name, and tenant ID: +1. Run the following commands to add [app secrets](/aspnet/core/security/app-secrets) for your Azure OpenAI endpoint and tenant ID: ```bash dotnet user-secrets init diff --git a/docs/ai/evaluation/evaluate-safety.md b/docs/ai/evaluation/evaluate-safety.md index ec261982b6888..29ca2566b7807 100644 --- a/docs/ai/evaluation/evaluate-safety.md +++ b/docs/ai/evaluation/evaluate-safety.md @@ -51,7 +51,7 @@ Complete the following steps to create an MSTest project. dotnet add package Microsoft.Extensions.Configuration.UserSecrets ``` -1. Run the following commands to add [app secrets](/aspnet/core/security/app-secrets) for your Azure OpenAI endpoint, model name, and tenant ID: +1. Run the following commands to add [app secrets](/aspnet/core/security/app-secrets) for your Azure OpenAI endpoint, tenant ID, subscription ID, resource group, and project: ```bash dotnet user-secrets init diff --git a/docs/ai/evaluation/evaluate-with-reporting.md b/docs/ai/evaluation/evaluate-with-reporting.md index cffe01f678d56..99785d4e8b5a5 100644 --- a/docs/ai/evaluation/evaluate-with-reporting.md +++ b/docs/ai/evaluation/evaluate-with-reporting.md @@ -42,7 +42,7 @@ Complete the following steps to create an MSTest project that connects to an AI dotnet add package Microsoft.Extensions.Configuration.UserSecrets ``` -1. Run the following commands to add [app secrets](/aspnet/core/security/app-secrets) for your Azure OpenAI endpoint, model name, and tenant ID: +1. Run the following commands to add [app secrets](/aspnet/core/security/app-secrets) for your Azure OpenAI endpoint and tenant ID: ```bash dotnet user-secrets init diff --git a/docs/ai/get-started-app-chat-scaling-with-azure-container-apps.md b/docs/ai/get-started-app-chat-scaling-with-azure-container-apps.md index 586277b7518c1..6e614353b1995 100644 --- a/docs/ai/get-started-app-chat-scaling-with-azure-container-apps.md +++ b/docs/ai/get-started-app-chat-scaling-with-azure-container-apps.md @@ -1,7 +1,8 @@ --- title: Scale Azure OpenAI for .NET chat sample using RAG description: Learn how to add load balancing to your application to extend the chat app beyond the Azure OpenAI token and model quota limits. -ms.date: 05/29/2025 +ms.date: 03/04/2026 +ai-usage: ai-assisted ms.topic: get-started # CustomerIntent: As a .NET developer new to Azure OpenAI, I want to scale my Azure OpenAI capacity to avoid rate limit errors with Azure Container Apps. --- @@ -18,7 +19,7 @@ ms.topic: get-started #### [Codespaces (recommended)](#tab/github-codespaces) -* Only a [GitHub account](https://www.github.com/login) is required to use CodeSpaces +* You only need a [GitHub account](https://www.github.com/login) to use Codespaces. #### [Visual Studio Code](#tab/visual-studio-code) diff --git a/docs/ai/get-started-app-chat-template.md b/docs/ai/get-started-app-chat-template.md index 4c2996d856587..5b3f3842763a3 100644 --- a/docs/ai/get-started-app-chat-template.md +++ b/docs/ai/get-started-app-chat-template.md @@ -1,8 +1,9 @@ --- title: "Get started with the 'chat using your own data sample' for .NET" description: Get started with .NET and search across your own data using a chat app sample implemented using Azure OpenAI Service and Retrieval Augmented Generation (RAG) in Azure AI Search. Easily deploy with Azure Developer CLI. This article uses the Azure AI Reference Template sample. -ms.date: 05/28/2025 +ms.date: 03/04/2026 ms.topic: get-started +ai-usage: ai-assisted # CustomerIntent: As a .NET developer new to Azure OpenAI, I want deploy and use sample code to interact with app infused with my own business data so that learn from the sample code. --- @@ -12,13 +13,13 @@ This article shows you how to deploy and run the [Chat with your own data sample * [Demo video](https://aka.ms/azai/net/video) -By following the instructions in this article, you will: +In this article, you: - Deploy a chat app to Azure. - Get answers about employee benefits. - Change settings to change behavior of responses. -Once you complete this procedure, you can start modifying the new project with your custom code. +Once you complete this procedure, start modifying the new project with your custom code. This article is part of a collection of articles that show you how to build a chat app using Azure OpenAI service and Azure AI Search. @@ -43,7 +44,7 @@ The architecture of the chat app is shown in the following diagram: ## Cost -Most resources in this architecture use a basic or consumption pricing tier. Consumption pricing is based on usage, which means you only pay for what you use. To complete this article, there will be a charge, but it will be minimal. When you are done with the article, you can delete the resources to stop incurring charges. +Most resources in this architecture use a basic or consumption pricing tier. Consumption pricing is based on usage, which means you only pay for what you use. To complete this article, there's a charge, but it's minimal. When you're done with the article, delete the resources to stop incurring charges. For more information, see [Azure Samples: Cost in the sample repo](https://github.com/Azure-Samples/azure-search-openai-demo-csharp#cost-estimation). @@ -145,7 +146,7 @@ The sample repository contains all the code and configuration files you need to ### Deploy chat app to Azure > [!IMPORTANT] -> Azure resources created in this section incur immediate costs, primarily from the Azure AI Search resource. These resources may accrue costs even if you interrupt the command before it is fully executed. +> Azure resources created in this section incur immediate costs, primarily from the Azure AI Search resource. These resources may accrue costs even if you interrupt the command before it's fully executed. 1. Run the following Azure Developer CLI command to provision the Azure resources and deploy the source code: @@ -153,12 +154,12 @@ The sample repository contains all the code and configuration files you need to azd up ``` -1. When you're prompted to enter an environment name, keep it short and lowercase. For example, `myenv`. Its used as part of the resource group name. +1. When you're prompted to enter an environment name, keep it short and lowercase. For example, `myenv`. It's used as part of the resource group name. 1. When prompted, select a subscription to create the resources in. 1. When you're prompted to select a location the first time, select a location near you. This location is used for most the resources including hosting. 1. If you're prompted for a location for the OpenAI model, select a location that is near you. If the same location is available as your first location, select that. -1. Wait until app is deployed. It may take up to 20 minutes for the deployment to complete. -1. After the application has been successfully deployed, you see a URL displayed in the terminal. +1. Wait until the app is deployed. The deployment might take up to 20 minutes to complete. +1. After the application deploys successfully, a URL appears in the terminal. 1. Select that URL labeled `Deploying service web` to open the chat application in a browser. :::image type="content" source="./media/get-started-app-chat-template/browser-chat-with-your-data.png" alt-text="Screenshot of chat app in browser showing several suggestions for chat input and the chat text box to enter a question."::: @@ -172,7 +173,7 @@ The chat app is preloaded with employee benefits information from [PDF files](ht :::image type="content" source="./media/get-started-app-chat-template/browser-chat-initial-answer.png" lightbox="./media/get-started-app-chat-template/browser-chat-initial-answer.png" alt-text="Screenshot of chat app's first answer."::: -1. From the answer, select a citation. A pop-up window will open displaying the source of the information. +1. From the answer, select a citation. A pop-up window opens displaying the source of the information. :::image type="content" source="./media/get-started-app-chat-template/browser-chat-initial-answer-citation-highlighted.png" lightbox="./media/get-started-app-chat-template/browser-chat-initial-answer-citation-highlighted.png" alt-text="Screenshot of chat app's first answer with its citation highlighted in a red box."::: @@ -259,14 +260,14 @@ Deleting the GitHub Codespaces environment ensures that you can maximize the amo #### [Visual Studio Code](#tab/visual-studio-code) -You aren't necessarily required to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code in the context of a local workspace. +You don't need to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code locally. 1. Open the **Command Palette**, search for the **Dev Containers** commands, and then select **Dev Containers: Reopen Folder Locally**. :::image type="content" source="./media/get-started-app-chat-template/reopen-local-command-palette.png" alt-text="Screenshot of the Command Palette option to reopen the current folder within your local environment."::: > [!TIP] -> Visual Studio Code will stop the running development container, but the container still exists in Docker in a stopped state. You always have the option to deleting the container instance, container image, and volumes from Docker to free up more space on your local machine. +> Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. You can also delete the container instance, container image, and volumes from Docker to free up more space on your local machine. --- diff --git a/docs/ai/how-to/app-service-aoai-auth.md b/docs/ai/how-to/app-service-aoai-auth.md index 04003ef59d00f..f194220b6bc91 100644 --- a/docs/ai/how-to/app-service-aoai-auth.md +++ b/docs/ai/how-to/app-service-aoai-auth.md @@ -4,7 +4,8 @@ description: "Learn how to authenticate your Azure hosted .NET app to an Azure O author: alexwolfmsft ms.author: alexwolf ms.topic: how-to -ms.date: 05/29/2025 +ms.date: 03/04/2026 +ai-usage: ai-assisted zone_pivot_groups: azure-interface #customer intent: As a .NET developer, I want authenticate and authorize my App Service to Azure OpenAI by using Microsoft Entra so that I can securely use AI in my .NET application. --- @@ -13,7 +14,7 @@ zone_pivot_groups: azure-interface This article demonstrates how to use [Microsoft Entra ID managed identities](/azure/app-service/overview-managed-identity) and the [Microsoft.Extensions.AI library](../microsoft-extensions-ai.md) to authenticate an Azure hosted app to an Azure OpenAI resource. -A managed identity from Microsoft Entra ID allows your app to easily access other Microsoft Entra protected resources such as Azure OpenAI. The identity is managed by the Azure platform and doesn't require you to provision, manage, or rotate any secrets. +A managed identity from Microsoft Entra ID lets your app access other Microsoft Entra protected resources such as Azure OpenAI. Azure manages the identity and doesn't require you to provision, manage, or rotate any secrets. ## Prerequisites @@ -24,7 +25,7 @@ A managed identity from Microsoft Entra ID allows your app to easily access othe ## Add a managed identity to App Service -Managed identities provide an automatically managed identity in Microsoft Entra ID for applications to use when connecting to resources that support Microsoft Entra authentication. Applications can use managed identities to obtain Microsoft Entra tokens without having to manage any credentials. Your application can be assigned two types of identities: +Managed identities provide an automatically managed identity in Microsoft Entra ID for applications to use when connecting to resources that support Microsoft Entra authentication. Applications can use managed identities to obtain Microsoft Entra tokens without having to manage any credentials. You can assign two types of identities to your application: * A **system-assigned identity** is tied to your application and is deleted if your app is deleted. An app can have only one system-assigned identity. * A **user-assigned identity** is a standalone Azure resource that can be assigned to your app. An app can have multiple user-assigned identities. @@ -33,7 +34,7 @@ Managed identities provide an automatically managed identity in Microsoft Entra # [System-assigned](#tab/system-assigned) -1. Navigate to your app's page in the [Azure portal](https://aka.ms/azureportal), and then scroll down to the **Settings** group. +1. Go to your app's page in the [Azure portal](https://aka.ms/azureportal), and then scroll down to the **Settings** group. 1. Select **Identity**. 1. On the **System assigned** tab, toggle *Status* to **On**, and then select **Save**. @@ -96,7 +97,7 @@ az webapp identity assign --name --resource-group :::zone target="docs" pivot="azure-portal" -1. In the [Azure portal](https://aka.ms/azureportal), navigate to the scope that you want to grant **Azure OpenAI** access to. The scope can be a **Management group**, **Subscription**, **Resource group**, or a specific **Azure OpenAI** resource. +1. In the [Azure portal](https://aka.ms/azureportal), go to the scope that you want to grant **Azure OpenAI** access to. The scope can be a **Management group**, **Subscription**, **Resource group**, or a specific **Azure OpenAI** resource. 1. In the left navigation pane, select **Access control (IAM)**. 1. Select **Add**, then select **Add role assignment**. @@ -110,7 +111,7 @@ az webapp identity assign --name --resource-group :::zone target="docs" pivot="azure-cli" -You can use the Azure CLI to assign the Cognitive Services OpenAI User role to your managed identity at varying scopes. +Use the Azure CLI to assign the Cognitive Services OpenAI User role to your managed identity at different scopes. # [Resource](#tab/resource) @@ -163,10 +164,10 @@ az role assignment create --assignee "" \ The preceding packages each handle the following concerns for this scenario: - **[Azure.Identity](https://www.nuget.org/packages/Azure.Identity)**: Provides core functionality to work with Microsoft Entra ID - - **[Azure.AI.OpenAI](https://www.nuget.org/packages/Azure.AI.OpenAI)**: Enables your app to interface with the Azure OpenAI service + - **[Azure.AI.OpenAI](https://www.nuget.org/packages/Azure.AI.OpenAI)**: Lets your app interface with the Azure OpenAI service - **[Microsoft.Extensions.Azure](https://www.nuget.org/packages/Microsoft.Extensions.Azure)**: Provides helper extensions to register services for dependency injection - **[Microsoft.Extensions.AI](https://www.nuget.org/packages/Microsoft.Extensions.AI)**: Provides AI abstractions for common AI tasks - - **[Microsoft.Extensions.AI.OpenAI](https://www.nuget.org/packages/Microsoft.Extensions.AI.OpenAI)**: Enables you to use OpenAI service types as AI abstractions provided by **Microsoft.Extensions.AI** + - **[Microsoft.Extensions.AI.OpenAI](https://www.nuget.org/packages/Microsoft.Extensions.AI.OpenAI)**: Lets you use OpenAI service types as AI abstractions provided by **Microsoft.Extensions.AI** 1. In the `Program.cs` file of your app, create a `DefaultAzureCredential` object to discover and configure available credentials: @@ -181,7 +182,7 @@ az role assignment create --assignee "" \ :::code language="csharp" source="./snippets/hosted-app-auth/program.cs" range="41-46"::: > [!TIP] - > Learn more about ASP.NET Core dependency injection and how to register other AI services types in the Azure SDK for .NET [dependency injection](../../azure/sdk/dependency-injection.md) documentation. + > For more information about ASP.NET Core dependency injection and registering other AI service types, see the Azure SDK for .NET [dependency injection](../../azure/sdk/dependency-injection.md) documentation. ## Related content diff --git a/docs/ai/how-to/content-filtering.md b/docs/ai/how-to/content-filtering.md index 6eb65ca48f9a3..9e3eae9fda0a9 100644 --- a/docs/ai/how-to/content-filtering.md +++ b/docs/ai/how-to/content-filtering.md @@ -1,18 +1,16 @@ --- -title: "Manage OpenAI Content Filtering in a .NET app" -description: "Learn how to manage OpenAI content filtering programmatically in a .NET app using the OpenAI client library." +title: "Manage Azure OpenAI content filtering in a .NET app" +description: "Learn how to manage Azure OpenAI content filtering programmatically in a .NET app using the Azure OpenAI client library." ms.topic: how-to -ms.date: 05/29/2025 - -#customer intent: As a .NET developer, I want to manage OpenAI Content Filtering in a .NET app - +ms.date: 03/04/2026 +ai-usage: ai-assisted --- # Work with Azure OpenAI content filtering in a .NET app -This article demonstrates how to handle content filtering concerns in a .NET app. Azure OpenAI Service includes a content filtering system that works alongside core models. This system works by running both the prompt and completion through an ensemble of classification models aimed at detecting and preventing the output of harmful content. The content filtering system detects and takes action on specific categories of potentially harmful content in both input prompts and output completions. Variations in API configurations and application design might affect completions and thus filtering behavior. +This article shows how to handle content filtering in a .NET app. Azure OpenAI Service includes a content filtering system that works alongside core models. It runs both the prompt and completion through an ensemble of classification models to detect and take action on specific categories of potentially harmful content in both input prompts and output completions. Variations in API configurations and application design might affect completions and thus filtering behavior. -The [Content Filtering](/azure/ai-services/openai/concepts/content-filter) documentation provides a deeper exploration of content filtering concepts and concerns. This article provides examples of how to work with content filtering features programmatically in a .NET app. +For a deeper exploration of content filtering concepts and concerns, see the [Content Filtering](/azure/ai-services/openai/concepts/content-filter) documentation. ## Prerequisites diff --git a/docs/ai/ichatclient.md b/docs/ai/ichatclient.md index 344a9f032b233..55d90eafd4ec5 100644 --- a/docs/ai/ichatclient.md +++ b/docs/ai/ichatclient.md @@ -1,7 +1,7 @@ --- title: Use the IChatClient interface description: Learn how to use the IChatClient interface to get model responses and call tools. -ms.date: 12/10/2025 +ms.date: 03/13/2026 no-loc: ["IChatClient"] --- @@ -63,13 +63,6 @@ For more information about creating AI functions, see [Access data in AI functio You can also use Model Context Protocol (MCP) tools with your `IChatClient`. For more information, see [Build a minimal MCP client](./quickstarts/build-mcp-client.md). -### Tool reduction (experimental) - -> [!IMPORTANT] -> This feature is experimental and subject to change. - -Tool reduction helps manage large tool catalogs by trimming them based on relevance to the current conversation context. The interface defines strategies for reducing the number of tools sent to the model. The library provides implementations like that ranks tools by embedding similarity to the conversation. Use the extension method to add tool reduction to your chat client pipeline. - ## Cache responses If you're familiar with [caching in .NET](../core/extensions/caching.md), it's good to know that provides delegating `IChatClient` implementations for caching. The is an `IChatClient` that layers caching around another arbitrary `IChatClient` instance. When a novel chat history is submitted to the `DistributedCachingChatClient`, it forwards it to the underlying client and then caches the response before sending it back to the consumer. The next time the same history is submitted, such that a cached response can be found in the cache, the `DistributedCachingChatClient` returns the cached response rather than forwarding the request along the pipeline. diff --git a/docs/ai/quickstarts/snippets/mcp-client/MinimalMCPClient.csproj b/docs/ai/quickstarts/snippets/mcp-client/MinimalMCPClient.csproj index a3012cfd8be1e..5de85f75834c7 100644 --- a/docs/ai/quickstarts/snippets/mcp-client/MinimalMCPClient.csproj +++ b/docs/ai/quickstarts/snippets/mcp-client/MinimalMCPClient.csproj @@ -10,9 +10,9 @@ - - - + + + diff --git a/docs/ai/quickstarts/snippets/mcp-client/Program.cs b/docs/ai/quickstarts/snippets/mcp-client/Program.cs index e8d236fcb65d4..ece4bba1c9e70 100644 --- a/docs/ai/quickstarts/snippets/mcp-client/Program.cs +++ b/docs/ai/quickstarts/snippets/mcp-client/Program.cs @@ -2,6 +2,7 @@ using Azure.Identity; using Microsoft.Extensions.AI; using ModelContextProtocol.Client; +using ModelContextProtocol.Protocol; // Create an IChatClient using Azure OpenAI. IChatClient client = @@ -12,15 +13,15 @@ .UseFunctionInvocation() .Build(); -// Create the MCP client +// Create the MCP client. // Configure it to start and connect to your MCP server. -IMcpClient mcpClient = await McpClientFactory.CreateAsync( - new StdioClientTransport(new() - { - Command = "dotnet run", - Arguments = ["--project", ""], - Name = "Minimal MCP Server", - })); +var transport = new StdioClientTransport(new() +{ + Command = "dotnet run", + Arguments = ["--project", ""], + Name = "Minimal MCP Server", +}); +McpClient mcpClient = await McpClient.CreateAsync(transport); // List all available tools from the MCP server. Console.WriteLine("Available tools:"); diff --git a/docs/ai/quickstarts/structured-output.md b/docs/ai/quickstarts/structured-output.md index c6bb1cfacec62..94491a8df046d 100644 --- a/docs/ai/quickstarts/structured-output.md +++ b/docs/ai/quickstarts/structured-output.md @@ -40,7 +40,7 @@ Complete the following steps to create a console app that connects to the `gpt-5 dotnet add package Microsoft.Extensions.Configuration.UserSecrets ``` -1. Run the following commands to add [app secrets](/aspnet/core/security/app-secrets) for your Azure OpenAI endpoint, model name, and tenant ID: +1. Run the following commands to add [app secrets](/aspnet/core/security/app-secrets) for your Azure OpenAI endpoint and tenant ID: ```bash dotnet user-secrets init diff --git a/docs/ai/quickstarts/text-to-image.md b/docs/ai/quickstarts/text-to-image.md index d2702612d1611..8b454ab497d85 100644 --- a/docs/ai/quickstarts/text-to-image.md +++ b/docs/ai/quickstarts/text-to-image.md @@ -49,7 +49,7 @@ Complete the following steps to create a .NET console application that generates dotnet add package Microsoft.Extensions.Configuration.UserSecrets ``` -1. Run the following commands to add [app secrets](/aspnet/core/security/app-secrets) for your Azure OpenAI endpoint, model name, and API key: +1. Run the following commands to add [app secrets](/aspnet/core/security/app-secrets) for your Azure OpenAI endpoint and API key: ```bash dotnet user-secrets init diff --git a/docs/ai/tutorials/tutorial-ai-vector-search.md b/docs/ai/tutorials/tutorial-ai-vector-search.md index 3ec82474108d1..35999cc96dc36 100644 --- a/docs/ai/tutorials/tutorial-ai-vector-search.md +++ b/docs/ai/tutorials/tutorial-ai-vector-search.md @@ -1,7 +1,8 @@ --- title: Tutorial - Integrate OpenAI with the RAG pattern and vector search using Azure Cosmos DB for MongoDB description: Create a simple recipe app using the RAG pattern and vector search using Azure Cosmos DB for MongoDB. -ms.date: 08/26/2025 +ms.date: 03/04/2026 +ai-usage: ai-assisted ms.topic: tutorial author: alexwolfmsft ms.author: alexwolf @@ -9,7 +10,7 @@ ms.author: alexwolf # Implement Azure OpenAI with RAG using vector search in a .NET app -This tutorial explores integration of the RAG pattern using Open AI models and vector search capabilities in a .NET app. The sample application performs vector searches on custom data stored in Azure Cosmos DB for MongoDB and further refines the responses using generative AI models, such as GPT-35 and GPT-4. In the sections that follow, you'll set up a sample application and explore key code examples that demonstrate these concepts. +This tutorial explores integration of the RAG pattern using OpenAI models and vector search capabilities in a .NET app. The sample application performs vector searches on custom data stored in Azure Cosmos DB for MongoDB and further refines the responses using generative AI models, such as gpt-5. In the sections that follow, you set up a sample application and explore key code examples that demonstrate these concepts. ## Prerequisites @@ -22,10 +23,10 @@ This tutorial explores integration of the RAG pattern using Open AI models and v ## App overview -The Cosmos Recipe Guide app allows you to perform vector and AI driven searches against a set of recipe data. You can search directly for available recipes or prompt the app with ingredient names to find related recipes. The app and the sections ahead guide you through the following workflow to demonstrate this type of functionality: +The Cosmos Recipe Guide app lets you perform vector and AI-driven searches against a set of recipe data. Search directly for available recipes or prompt the app with ingredient names to find related recipes. The app and the sections ahead guide you through the following workflow to demonstrate this type of functionality: 1. Upload sample data to an Azure Cosmos DB for MongoDB database. -1. Create embeddings and a vector index for the uploaded sample data using the Azure OpenAI `text-embedding-ada-002` model. +1. Create embeddings and a vector index for the uploaded sample data using the Azure OpenAI `text-embedding-3-small` model. 1. Perform vector similarity search based on the user prompts. 1. Use the Azure OpenAI `gpt-35-turbo` completions model to compose more meaningful answers based on the search results data. @@ -41,7 +42,7 @@ The Cosmos Recipe Guide app allows you to perform vector and AI driven searches 1. In the _C#/CosmosDB-MongoDBvCore_ folder, open the **CosmosRecipeGuide.sln** file. -1. In the _appsettings.json_ file, replace the following config values with your Azure OpenAI and Azure CosmosDB for MongoDb values: +1. In the _appsettings.json_ file, replace the following config values with your Azure OpenAI and Azure Cosmos DB for MongoDB values: ```json "OpenAIEndpoint": "https://.openai.azure.com/", @@ -112,7 +113,7 @@ When you run the app for the first time, it connects to Azure Cosmos DB and repo 1. Select **Vectorize the recipe(s) and store them in Cosmos DB**. - The JSON items uploaded to Cosmos DB do not contain embeddings and therefore are not optimized for RAG via vector search. An embedding is an information-dense, numerical representation of the semantic meaning of a piece of text. Vector searches are able to find items with contextually similar embeddings. + The JSON items uploaded to Cosmos DB don't contain embeddings and therefore are not optimized for RAG via vector search. An embedding is an information-dense, numerical representation of the semantic meaning of a piece of text. Vector searches can find items with contextually similar embeddings. The `GetEmbeddingsAsync` method in the _OpenAIService.cs_ file creates an embedding for each item in the database. @@ -141,7 +142,7 @@ When you run the app for the first time, it connects to Azure Cosmos DB and repo } ``` - The `CreateVectorIndexIfNotExists` in the _VCoreMongoService.cs_ file creates a vector index, which enables you to perform vector similarity searches. + The `CreateVectorIndexIfNotExists` in the _VCoreMongoService.cs_ file creates a vector index, which lets you perform vector similarity searches. ```C# public void CreateVectorIndexIfNotExists(string vectorIndexName) @@ -184,9 +185,9 @@ When you run the app for the first time, it connects to Azure Cosmos DB and repo } ``` -1. Select the **Ask AI Assistant (search for a recipe by name or description, or ask a question)** option in the application to run a user query. +1. Select the **Ask AI Assistant (search for a recipe by name or description, or ask a question)** option in the app to run a user query. - The user query is converted to an embedding using the OpenAI service and the embedding model. The embedding is then sent to Azure Cosmos DB for MongoDB and is used to perform a vector search. The `VectorSearchAsync` method in the _VCoreMongoService.cs_ file performs a vector search to find vectors that are close to the supplied vector and returns a list of documents from Azure Cosmos DB for MongoDB vCore. + The app converts the user query to an embedding using the OpenAI service and the embedding model, then sends the embedding to Azure Cosmos DB for MongoDB to perform a vector search. The `VectorSearchAsync` method in the _VCoreMongoService.cs_ file performs a vector search to find vectors that are close to the supplied vector and returns a list of documents from Azure Cosmos DB for MongoDB vCore. ```C# public async Task> VectorSearchAsync(float[] queryVector) diff --git a/docs/azure/includes/dotnet-all.md b/docs/azure/includes/dotnet-all.md index 45a09afe6e33e..dd1ae8fec7b19 100644 --- a/docs/azure/includes/dotnet-all.md +++ b/docs/azure/includes/dotnet-all.md @@ -1,8 +1,8 @@ | Name | Package | Docs | Source | | ---- | ------- | ---- | ------ | -| AI Agent Server - Agent Framework | NuGet [1.0.0-beta.9](https://www.nuget.org/packages/Azure.AI.AgentServer.AgentFramework/1.0.0-beta.9) | [docs](/dotnet/api/overview/azure/AI.AgentServer.AgentFramework-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.9](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.AgentFramework_1.0.0-beta.9/sdk/agentserver/Azure.AI.AgentServer.AgentFramework/) | -| AI Agent Server - Contracts | NuGet [1.0.0-beta.9](https://www.nuget.org/packages/Azure.AI.AgentServer.Contracts/1.0.0-beta.9) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Contracts-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.9](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Contracts_1.0.0-beta.9/sdk/agentserver/Azure.AI.AgentServer.Contracts/) | -| AI Agent Server - Core | NuGet [1.0.0-beta.9](https://www.nuget.org/packages/Azure.AI.AgentServer.Core/1.0.0-beta.9) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Core-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.9](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Core_1.0.0-beta.9/sdk/agentserver/Azure.AI.AgentServer.Core/) | +| AI Agent Server - Agent Framework | NuGet [1.0.0-beta.10](https://www.nuget.org/packages/Azure.AI.AgentServer.AgentFramework/1.0.0-beta.10) | [docs](/dotnet/api/overview/azure/AI.AgentServer.AgentFramework-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.10](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.AgentFramework_1.0.0-beta.10/sdk/agentserver/Azure.AI.AgentServer.AgentFramework/) | +| AI Agent Server - Contracts | NuGet [1.0.0-beta.10](https://www.nuget.org/packages/Azure.AI.AgentServer.Contracts/1.0.0-beta.10) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Contracts-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.10](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Contracts_1.0.0-beta.10/sdk/agentserver/Azure.AI.AgentServer.Contracts/) | +| AI Agent Server - Core | NuGet [1.0.0-beta.10](https://www.nuget.org/packages/Azure.AI.AgentServer.Core/1.0.0-beta.10) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Core-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.10](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Core_1.0.0-beta.10/sdk/agentserver/Azure.AI.AgentServer.Core/) | | AI Agents Persistent | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.Agents.Persistent/1.1.0)
NuGet [1.2.0-beta.9](https://www.nuget.org/packages/Azure.AI.Agents.Persistent/1.2.0-beta.9) | [docs](/dotnet/api/overview/azure/AI.Agents.Persistent-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Agents.Persistent_1.1.0/sdk/ai/Azure.AI.Agents.Persistent/)
GitHub [1.2.0-beta.9](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Agents.Persistent_1.2.0-beta.9/sdk/ai/Azure.AI.Agents.Persistent/) | | AI Foundry | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.Projects/1.1.0)
NuGet [2.0.0-beta.1](https://www.nuget.org/packages/Azure.AI.Projects/2.0.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Projects-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects_1.1.0/sdk/ai/Azure.AI.Projects/)
GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects_2.0.0-beta.1/sdk/ai/Azure.AI.Projects/) | | AI Model Inference | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.AI.Inference/1.0.0-beta.5) | [docs](/dotnet/api/overview/azure/AI.Inference-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Inference_1.0.0-beta.5/sdk/ai/Azure.AI.Inference/) | @@ -28,7 +28,7 @@ | Confidential Ledger | NuGet [1.3.0](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.3.0)
NuGet [1.4.1-beta.3](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.4.1-beta.3) | [docs](/dotnet/api/overview/azure/Security.ConfidentialLedger-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.3.0/sdk/confidentialledger/Azure.Security.ConfidentialLedger/)
GitHub [1.4.1-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.4.1-beta.3/sdk/confidentialledger/Azure.Security.ConfidentialLedger/) | | Container Registry | NuGet [1.3.0](https://www.nuget.org/packages/Azure.Containers.ContainerRegistry/1.3.0) | [docs](/dotnet/api/overview/azure/Containers.ContainerRegistry-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Containers.ContainerRegistry_1.3.0/sdk/containerregistry/Azure.Containers.ContainerRegistry/) | | Content Safety | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.ContentSafety/1.0.0) | [docs](/dotnet/api/overview/azure/AI.ContentSafety-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.ContentSafety_1.0.0/sdk/contentsafety/Azure.AI.ContentSafety/) | -| Content Understanding | NuGet [1.0.1](https://www.nuget.org/packages/Azure.AI.ContentUnderstanding/1.0.1) | [docs](/dotnet/api/overview/azure/AI.ContentUnderstanding-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.ContentUnderstanding_1.0.1/sdk/contentunderstanding/Azure.AI.ContentUnderstanding/) | +| Content Understanding | NuGet [1.0.2](https://www.nuget.org/packages/Azure.AI.ContentUnderstanding/1.0.2) | [docs](/dotnet/api/overview/azure/AI.ContentUnderstanding-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.ContentUnderstanding_1.0.2/sdk/contentunderstanding/Azure.AI.ContentUnderstanding/) | | Conversational Language Understanding | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.Language.Conversations/1.1.0)
NuGet [2.0.0-beta.5](https://www.nuget.org/packages/Azure.AI.Language.Conversations/2.0.0-beta.5) | [docs](/dotnet/api/overview/azure/AI.Language.Conversations-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Conversations_1.1.0/sdk/cognitivelanguage/Azure.AI.Language.Conversations/)
GitHub [2.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Conversations_2.0.0-beta.5/sdk/cognitivelanguage/Azure.AI.Language.Conversations/) | | Conversations Authoring | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.AI.Language.Conversations.Authoring/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/AI.Language.Conversations.Authoring-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Conversations.Authoring_1.0.0-beta.3/sdk/cognitivelanguage/Azure.AI.Language.Conversations.Authoring/) | | Core - Client - AMQP | NuGet [1.3.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.3.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.3.1/sdk/core/Azure.Core.Amqp/) | @@ -57,7 +57,7 @@ | Health Insights Cancer Profiling | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Health.Insights.CancerProfiling/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Health.Insights.CancerProfiling-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Insights.CancerProfiling_1.0.0-beta.1/sdk/healthinsights/Azure.Health.Insights.CancerProfiling/) | | Health Insights Clinical Matching | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Health.Insights.ClinicalMatching/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Health.Insights.ClinicalMatching-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Insights.ClinicalMatching_1.0.0-beta.1/sdk/healthinsights/Azure.Health.Insights.ClinicalMatching/) | | Health Insights Radiology Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Health.Insights.RadiologyInsights/1.1.0) | [docs](/dotnet/api/overview/azure/Health.Insights.RadiologyInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Insights.RadiologyInsights_1.1.0/sdk/healthinsights/Azure.Health.Insights.RadiologyInsights/) | -| Identity | NuGet [1.18.0](https://www.nuget.org/packages/Azure.Identity/1.18.0) | [docs](/dotnet/api/overview/azure/Identity-readme) | GitHub [1.18.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.18.0/sdk/identity/Azure.Identity/) | +| Identity | NuGet [1.19.0](https://www.nuget.org/packages/Azure.Identity/1.19.0) | [docs](/dotnet/api/overview/azure/Identity-readme) | GitHub [1.19.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.19.0/sdk/identity/Azure.Identity/) | | Identity Broker | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Identity.Broker/1.4.0) | [docs](/dotnet/api/overview/azure/Identity.Broker-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity.Broker_1.4.0/sdk/identity/Azure.Identity.Broker/) | | Image Analysis | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.Vision.ImageAnalysis/1.0.0) | [docs](/dotnet/api/overview/azure/AI.Vision.ImageAnalysis-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Vision.ImageAnalysis_1.0.0/sdk/vision/Azure.AI.Vision.ImageAnalysis/) | | Key Vault - Administration | NuGet [4.7.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.7.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Administration-readme) | GitHub [4.7.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.7.0/sdk/keyvault/Azure.Security.KeyVault.Administration/) | @@ -146,9 +146,10 @@ | Functions extension for Storage Queues | NuGet [5.3.7](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/5.3.7) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.Storage.Queues-readme) | GitHub [5.3.7](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.Storage.Queues_5.3.7/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/) | | Functions extension for WebPubSub for SocketIO | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO/1.0.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO_1.0.0/sdk/webpubsub/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO/) | | Provisioning - App Configuration | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.AppConfiguration/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.AppConfiguration/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.AppConfiguration-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppConfiguration_1.1.0/sdk/provisioning/Azure.Provisioning.AppConfiguration/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppConfiguration_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.AppConfiguration/) | -| Provisioning - App Containers | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.AppContainers/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.AppContainers/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.AppContainers-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppContainers_1.1.0/sdk/provisioning/Azure.Provisioning.AppContainers/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppContainers_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.AppContainers/) | +| Provisioning - App Containers | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Provisioning.AppContainers/1.2.0) | [docs](/dotnet/api/overview/azure/Provisioning.AppContainers-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppContainers_1.2.0/sdk/provisioning/Azure.Provisioning.AppContainers/) | | Provisioning - App Service | NuGet [1.3.1](https://www.nuget.org/packages/Azure.Provisioning.AppService/1.3.1)
NuGet [1.4.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.AppService/1.4.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.AppService-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppService_1.3.1/sdk/provisioning/Azure.Provisioning.AppService/)
GitHub [1.4.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppService_1.4.0-beta.2/sdk/provisioning/Azure.Provisioning.AppService/) | | Provisioning - Application Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.ApplicationInsights/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.ApplicationInsights/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.ApplicationInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ApplicationInsights_1.1.0/sdk/provisioning/Azure.Provisioning.ApplicationInsights/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ApplicationInsights_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.ApplicationInsights/) | +| Provisioning - Cdn | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Cdn/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Cdn-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Cdn_1.0.0-beta.1/sdk/provisioning/Azure.Provisioning.Cdn/) | | Provisioning - Cognitive Services | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Provisioning.CognitiveServices/1.2.0) | [docs](/dotnet/api/overview/azure/Provisioning.CognitiveServices-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.CognitiveServices_1.2.0/sdk/provisioning/Azure.Provisioning.CognitiveServices/) | | Provisioning - Communication | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Provisioning.Communication/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Provisioning.Communication-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Communication_1.0.0-beta.4/sdk/provisioning/Azure.Provisioning.Communication/) | | Provisioning - Container Registry | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.ContainerRegistry/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.ContainerRegistry-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ContainerRegistry_1.1.0/sdk/provisioning/Azure.Provisioning.ContainerRegistry/) | @@ -222,8 +223,9 @@ | Resource Management - Container Instances | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerInstance/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerInstance-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerInstance_1.3.0/sdk/containerinstance/Azure.ResourceManager.ContainerInstance/) | | Resource Management - Container Orchestrator Runtime | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerOrchestratorRuntime/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerOrchestratorRuntime-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerOrchestratorRuntime_1.0.0-beta.1/sdk/containerorchestratorruntime/Azure.ResourceManager.ContainerOrchestratorRuntime/) | | Resource Management - Container Registry | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry/1.4.0)
NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerRegistry-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry_1.4.0/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry/)
GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry_1.5.0-beta.1/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry/) | -| Resource Management - Container Service | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerService/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerService-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerService_1.3.1/sdk/containerservice/Azure.ResourceManager.ContainerService/) | +| Resource Management - Container Service | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerService/1.3.1)
NuGet [1.4.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerService/1.4.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerService-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerService_1.3.1/sdk/containerservice/Azure.ResourceManager.ContainerService/)
GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerService_1.4.0-beta.1/sdk/containerservice/Azure.ResourceManager.ContainerService/) | | Resource Management - Container Service Fleet | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerServiceFleet/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerServiceFleet/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerServiceFleet-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerServiceFleet_1.1.0/sdk/fleet/Azure.ResourceManager.ContainerServiceFleet/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerServiceFleet_1.2.0-beta.1/sdk/fleet/Azure.ResourceManager.ContainerServiceFleet/) | +| Resource Management - Containerregistry.Tasks | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry.Tasks/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerRegistry.Tasks-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry.Tasks_1.0.0-beta.1/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry.Tasks/) | | Resource Management - Content Delivery Network | NuGet [1.5.1](https://www.nuget.org/packages/Azure.ResourceManager.Cdn/1.5.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Cdn-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Cdn_1.5.1/sdk/cdn/Azure.ResourceManager.Cdn/) | | Resource Management - Cosmos DB | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDB/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.CosmosDB-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDB_1.4.0/sdk/cosmosdb/Azure.ResourceManager.CosmosDB/) | | Resource Management - Cosmos DB for PostgreSQL | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDBForPostgreSql/1.0.0)
NuGet [1.1.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDBForPostgreSql/1.1.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.CosmosDBForPostgreSql-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDBForPostgreSql_1.0.0/sdk/cosmosdbforpostgresql/Azure.ResourceManager.CosmosDBForPostgreSql/)
GitHub [1.1.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDBForPostgreSql_1.1.0-beta.2/sdk/cosmosdbforpostgresql/Azure.ResourceManager.CosmosDBForPostgreSql/) | @@ -256,7 +258,7 @@ | Resource Management - Disconnectedoperations | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DisconnectedOperations/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DisconnectedOperations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DisconnectedOperations_1.0.0/sdk/disconnectedoperations/Azure.ResourceManager.DisconnectedOperations/) | | Resource Management - DNS | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.Dns/1.1.1)
NuGet [1.2.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Dns/1.2.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Dns-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dns_1.1.1/sdk/dns/Azure.ResourceManager.Dns/)
GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dns_1.2.0-beta.2/sdk/dns/Azure.ResourceManager.Dns/) | | Resource Management - DNS Resolver | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.DnsResolver/1.2.0)
NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DnsResolver/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DnsResolver-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DnsResolver_1.2.0/sdk/dnsresolver/Azure.ResourceManager.DnsResolver/)
GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DnsResolver_1.3.0-beta.1/sdk/dnsresolver/Azure.ResourceManager.DnsResolver/) | -| Resource Management - Durabletask | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DurableTask/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DurableTask-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DurableTask_1.0.0/sdk/durabletask/Azure.ResourceManager.DurableTask/) | +| Resource Management - Durabletask | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.DurableTask/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DurableTask-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DurableTask_1.1.0/sdk/durabletask/Azure.ResourceManager.DurableTask/) | | Resource Management - Dynatrace | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Dynatrace/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Dynatrace-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dynatrace_1.2.0/sdk/dynatrace/Azure.ResourceManager.Dynatrace/) | | Resource Management - Edge Order | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.EdgeOrder/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.EdgeOrder-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EdgeOrder_1.1.1/sdk/edgeorder/Azure.ResourceManager.EdgeOrder/) | | Resource Management - Edge Zones | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.EdgeZones/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.EdgeZones-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EdgeZones_1.0.0-beta.2/sdk/edgezones/Azure.ResourceManager.EdgeZones/) | @@ -369,7 +371,7 @@ | Resource Management - Self Help | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.SelfHelp/1.0.0)
NuGet [1.1.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.SelfHelp/1.1.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.SelfHelp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SelfHelp_1.0.0/sdk/selfhelp/Azure.ResourceManager.SelfHelp/)
GitHub [1.1.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SelfHelp_1.1.0-beta.5/sdk/selfhelp/Azure.ResourceManager.SelfHelp/) | | Resource Management - Service Bus | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceBus/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ServiceBus/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceBus-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceBus_1.1.0/sdk/servicebus/Azure.ResourceManager.ServiceBus/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceBus_1.2.0-beta.1/sdk/servicebus/Azure.ResourceManager.ServiceBus/) | | Resource Management - Service Fabric | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabric/1.1.0)
NuGet [1.2.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabric/1.2.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceFabric-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabric_1.1.0/sdk/servicefabric/Azure.ResourceManager.ServiceFabric/)
GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabric_1.2.0-beta.2/sdk/servicefabric/Azure.ResourceManager.ServiceFabric/) | -| Resource Management - Service Fabric Managed Clusters | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabricManagedClusters/1.2.0)
NuGet [1.3.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabricManagedClusters/1.3.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceFabricManagedClusters-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabricManagedClusters_1.2.0/sdk/servicefabricmanagedclusters/Azure.ResourceManager.ServiceFabricManagedClusters/)
GitHub [1.3.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabricManagedClusters_1.3.0-beta.5/sdk/servicefabricmanagedclusters/Azure.ResourceManager.ServiceFabricManagedClusters/) | +| Resource Management - Service Fabric Managed Clusters | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabricManagedClusters/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceFabricManagedClusters-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabricManagedClusters_1.3.0/sdk/servicefabricmanagedclusters/Azure.ResourceManager.ServiceFabricManagedClusters/) | | Resource Management - Service Linker | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.ServiceLinker/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceLinker-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceLinker_1.1.1/sdk/servicelinker/Azure.ResourceManager.ServiceLinker/) | | Resource Management - Service Networking | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceNetworking/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceNetworking-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceNetworking_1.1.0/sdk/servicenetworking/Azure.ResourceManager.ServiceNetworking/) | | Resource Management - Servicegroups | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ServiceGroups/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceGroups-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceGroups_1.0.0-beta.1/sdk/servicegroups/Azure.ResourceManager.ServiceGroups/) | @@ -404,13 +406,13 @@ | Resource Management - Workloadssapvirtualinstance | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.WorkloadsSapVirtualInstance/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.WorkloadsSapVirtualInstance-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.WorkloadsSapVirtualInstance_1.0.0-beta.1/sdk/workloadssapvirtualinstance/Azure.ResourceManager.WorkloadsSapVirtualInstance/) | | App Configuration Extension | NuGet [8.5.0](https://www.nuget.org/packages/Microsoft.Azure.AppConfiguration.Functions.Worker/8.5.0)
NuGet [8.6.0-preview](https://www.nuget.org/packages/Microsoft.Azure.AppConfiguration.Functions.Worker/8.6.0-preview) | | | | App Configuration Provider | NuGet [8.5.0](https://www.nuget.org/packages/Microsoft.Azure.AppConfiguration.AspNetCore/8.5.0)
NuGet [8.6.0-preview](https://www.nuget.org/packages/Microsoft.Azure.AppConfiguration.AspNetCore/8.6.0-preview) | | | -| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp/1.0.0)
NuGet [2.0.0-beta.26](https://www.nuget.org/packages/Azure.Mcp/2.0.0-beta.26) | | | -| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.linux-arm64/1.0.0)
NuGet [2.0.0-beta.26](https://www.nuget.org/packages/Azure.Mcp.linux-arm64/2.0.0-beta.26) | | | -| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.linux-x64/1.0.0)
NuGet [2.0.0-beta.26](https://www.nuget.org/packages/Azure.Mcp.linux-x64/2.0.0-beta.26) | | | -| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.osx-arm64/1.0.0)
NuGet [2.0.0-beta.26](https://www.nuget.org/packages/Azure.Mcp.osx-arm64/2.0.0-beta.26) | | | -| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.osx-x64/1.0.0)
NuGet [2.0.0-beta.26](https://www.nuget.org/packages/Azure.Mcp.osx-x64/2.0.0-beta.26) | | | -| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.win-arm64/1.0.0)
NuGet [2.0.0-beta.26](https://www.nuget.org/packages/Azure.Mcp.win-arm64/2.0.0-beta.26) | | | -| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.win-x64/1.0.0)
NuGet [2.0.0-beta.26](https://www.nuget.org/packages/Azure.Mcp.win-x64/2.0.0-beta.26) | | | +| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp/1.0.0)
NuGet [2.0.0-beta.27](https://www.nuget.org/packages/Azure.Mcp/2.0.0-beta.27) | | | +| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.linux-arm64/1.0.0)
NuGet [2.0.0-beta.27](https://www.nuget.org/packages/Azure.Mcp.linux-arm64/2.0.0-beta.27) | | | +| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.linux-x64/1.0.0)
NuGet [2.0.0-beta.27](https://www.nuget.org/packages/Azure.Mcp.linux-x64/2.0.0-beta.27) | | | +| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.osx-arm64/1.0.0)
NuGet [2.0.0-beta.27](https://www.nuget.org/packages/Azure.Mcp.osx-arm64/2.0.0-beta.27) | | | +| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.osx-x64/1.0.0)
NuGet [2.0.0-beta.27](https://www.nuget.org/packages/Azure.Mcp.osx-x64/2.0.0-beta.27) | | | +| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.win-arm64/1.0.0)
NuGet [2.0.0-beta.27](https://www.nuget.org/packages/Azure.Mcp.win-arm64/2.0.0-beta.27) | | | +| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.win-x64/1.0.0)
NuGet [2.0.0-beta.27](https://www.nuget.org/packages/Azure.Mcp.win-x64/2.0.0-beta.27) | | | | Azure MCP Types Internal | NuGet [0.2.804](https://www.nuget.org/packages/Microsoft.Azure.Mcp.AzTypes.Internal.Compact/0.2.804) | | | | Azure.Communication.Administration | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Communication.Administration/1.0.0-beta.3) | | | | Caching - PostgreSQL | NuGet [1.2.1](https://www.nuget.org/packages/Microsoft.Extensions.Caching.Postgres/1.2.1) | | | @@ -427,15 +429,15 @@ | Fabric MCP | NuGet [0.0.0-beta.9](https://www.nuget.org/packages/Microsoft.Fabric.Mcp.osx-x64/0.0.0-beta.9) | | | | Fabric MCP | NuGet [0.0.0-beta.9](https://www.nuget.org/packages/Microsoft.Fabric.Mcp.win-arm64/0.0.0-beta.9) | | | | Fabric MCP | NuGet [0.0.0-beta.9](https://www.nuget.org/packages/Microsoft.Fabric.Mcp.win-x64/0.0.0-beta.9) | | | -| Functions Extension MCP | NuGet [1.2.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Extensions.Mcp/1.2.0) | | | -| Functions Worker Extension MCP | NuGet [1.1.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Mcp/1.1.0)
NuGet [1.2.0-preview.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Mcp/1.2.0-preview.1) | | | +| Functions Extension MCP | NuGet [1.3.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Extensions.Mcp/1.3.0) | | | +| Functions Worker Extension MCP | NuGet [1.3.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Mcp/1.3.0) | | | | Functions Worker Extension MCP SDK | NuGet [1.0.0-preview.2](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Mcp.Sdk/1.0.0-preview.2) | | | | Functions Worker Extension MySQL | NuGet [1.0.129](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.MySql/1.0.129) | | | | HTTP ASPNETCore Analyzers | NuGet [1.0.4](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore.Analyzers/1.0.4) | | | | IoT Operations Connector | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Iot.Operations.Connector/1.0.0)
NuGet [1.1.0-rc](https://www.nuget.org/packages/Azure.Iot.Operations.Connector/1.1.0-rc) | | | | IoT Operations MQTT | NuGet [1.0.1](https://www.nuget.org/packages/Azure.Iot.Operations.Mqtt/1.0.1) | | | | IoT Operations Protocol | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Iot.Operations.Protocol/1.1.0) | | | -| IoT Operations Services | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Iot.Operations.Services/1.0.0)
NuGet [1.2.0-rc2](https://www.nuget.org/packages/Azure.Iot.Operations.Services/1.2.0-rc2) | | | +| IoT Operations Services | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Iot.Operations.Services/1.0.0)
NuGet [1.2.0-rc3](https://www.nuget.org/packages/Azure.Iot.Operations.Services/1.2.0-rc3) | | | | IoT Operations Templates | NuGet [0.1.0](https://www.nuget.org/packages/Azure.Iot.Operations.Templates/0.1.0) | | | | Item Templates NetCore | NuGet [4.0.5337](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.ItemTemplates.NetCore/4.0.5337) | | | | Item Templates NetFx | NuGet [4.0.5337](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.ItemTemplates.NetFx/4.0.5337) | | | @@ -604,9 +606,9 @@ | Microsoft.Azure.Functions.Worker.Extensions.ServiceBus | NuGet [5.24.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.ServiceBus/5.24.0) | | | | Microsoft.Azure.Functions.Worker.Extensions.SignalRService | NuGet [2.0.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.SignalRService/2.0.1) | | | | Microsoft.Azure.Functions.Worker.Extensions.Sql | NuGet [3.1.527](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Sql/3.1.527) | | | -| Microsoft.Azure.Functions.Worker.Extensions.Storage | NuGet [6.8.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Storage/6.8.0) | | | -| Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs | NuGet [6.8.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs/6.8.0) | | | -| Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues | NuGet [5.5.3](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues/5.5.3) | | | +| Microsoft.Azure.Functions.Worker.Extensions.Storage | NuGet [6.8.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Storage/6.8.1) | | | +| Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs | NuGet [6.8.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs/6.8.1) | | | +| Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues | NuGet [5.5.4](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues/5.5.4) | | | | Microsoft.Azure.Functions.Worker.Extensions.Storage.Tables | NuGet [1.0.0-preview1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Storage.Tables/1.0.0-preview1) | | | | Microsoft.Azure.Functions.Worker.Extensions.Tables | NuGet [1.5.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Tables/1.5.0) | | | | Microsoft.Azure.Functions.Worker.Extensions.Timer | NuGet [4.3.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Timer/4.3.1) | | | diff --git a/docs/azure/includes/dotnet-new.md b/docs/azure/includes/dotnet-new.md index 2d02df20a63b4..3bca20d007aeb 100644 --- a/docs/azure/includes/dotnet-new.md +++ b/docs/azure/includes/dotnet-new.md @@ -1,8 +1,8 @@ | Name | Package | Docs | Source | | ---- | ------- | ---- | ------ | -| AI Agent Server - Agent Framework | NuGet [1.0.0-beta.9](https://www.nuget.org/packages/Azure.AI.AgentServer.AgentFramework/1.0.0-beta.9) | [docs](/dotnet/api/overview/azure/AI.AgentServer.AgentFramework-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.9](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.AgentFramework_1.0.0-beta.9/sdk/agentserver/Azure.AI.AgentServer.AgentFramework/) | -| AI Agent Server - Contracts | NuGet [1.0.0-beta.9](https://www.nuget.org/packages/Azure.AI.AgentServer.Contracts/1.0.0-beta.9) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Contracts-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.9](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Contracts_1.0.0-beta.9/sdk/agentserver/Azure.AI.AgentServer.Contracts/) | -| AI Agent Server - Core | NuGet [1.0.0-beta.9](https://www.nuget.org/packages/Azure.AI.AgentServer.Core/1.0.0-beta.9) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Core-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.9](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Core_1.0.0-beta.9/sdk/agentserver/Azure.AI.AgentServer.Core/) | +| AI Agent Server - Agent Framework | NuGet [1.0.0-beta.10](https://www.nuget.org/packages/Azure.AI.AgentServer.AgentFramework/1.0.0-beta.10) | [docs](/dotnet/api/overview/azure/AI.AgentServer.AgentFramework-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.10](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.AgentFramework_1.0.0-beta.10/sdk/agentserver/Azure.AI.AgentServer.AgentFramework/) | +| AI Agent Server - Contracts | NuGet [1.0.0-beta.10](https://www.nuget.org/packages/Azure.AI.AgentServer.Contracts/1.0.0-beta.10) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Contracts-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.10](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Contracts_1.0.0-beta.10/sdk/agentserver/Azure.AI.AgentServer.Contracts/) | +| AI Agent Server - Core | NuGet [1.0.0-beta.10](https://www.nuget.org/packages/Azure.AI.AgentServer.Core/1.0.0-beta.10) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Core-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.10](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Core_1.0.0-beta.10/sdk/agentserver/Azure.AI.AgentServer.Core/) | | AI Agents Persistent | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.Agents.Persistent/1.1.0)
NuGet [1.2.0-beta.9](https://www.nuget.org/packages/Azure.AI.Agents.Persistent/1.2.0-beta.9) | [docs](/dotnet/api/overview/azure/AI.Agents.Persistent-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Agents.Persistent_1.1.0/sdk/ai/Azure.AI.Agents.Persistent/)
GitHub [1.2.0-beta.9](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Agents.Persistent_1.2.0-beta.9/sdk/ai/Azure.AI.Agents.Persistent/) | | AI Foundry | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.Projects/1.1.0)
NuGet [2.0.0-beta.1](https://www.nuget.org/packages/Azure.AI.Projects/2.0.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Projects-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects_1.1.0/sdk/ai/Azure.AI.Projects/)
GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects_2.0.0-beta.1/sdk/ai/Azure.AI.Projects/) | | AI Model Inference | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.AI.Inference/1.0.0-beta.5) | [docs](/dotnet/api/overview/azure/AI.Inference-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Inference_1.0.0-beta.5/sdk/ai/Azure.AI.Inference/) | @@ -32,7 +32,7 @@ | Confidential Ledger | NuGet [1.3.0](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.3.0)
NuGet [1.4.1-beta.3](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.4.1-beta.3) | [docs](/dotnet/api/overview/azure/Security.ConfidentialLedger-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.3.0/sdk/confidentialledger/Azure.Security.ConfidentialLedger/)
GitHub [1.4.1-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.4.1-beta.3/sdk/confidentialledger/Azure.Security.ConfidentialLedger/) | | Container Registry | NuGet [1.3.0](https://www.nuget.org/packages/Azure.Containers.ContainerRegistry/1.3.0) | [docs](/dotnet/api/overview/azure/Containers.ContainerRegistry-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Containers.ContainerRegistry_1.3.0/sdk/containerregistry/Azure.Containers.ContainerRegistry/) | | Content Safety | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.ContentSafety/1.0.0) | [docs](/dotnet/api/overview/azure/AI.ContentSafety-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.ContentSafety_1.0.0/sdk/contentsafety/Azure.AI.ContentSafety/) | -| Content Understanding | NuGet [1.0.1](https://www.nuget.org/packages/Azure.AI.ContentUnderstanding/1.0.1) | [docs](/dotnet/api/overview/azure/AI.ContentUnderstanding-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.ContentUnderstanding_1.0.1/sdk/contentunderstanding/Azure.AI.ContentUnderstanding/) | +| Content Understanding | NuGet [1.0.2](https://www.nuget.org/packages/Azure.AI.ContentUnderstanding/1.0.2) | [docs](/dotnet/api/overview/azure/AI.ContentUnderstanding-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.ContentUnderstanding_1.0.2/sdk/contentunderstanding/Azure.AI.ContentUnderstanding/) | | Conversational Language Understanding | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.Language.Conversations/1.1.0)
NuGet [2.0.0-beta.5](https://www.nuget.org/packages/Azure.AI.Language.Conversations/2.0.0-beta.5) | [docs](/dotnet/api/overview/azure/AI.Language.Conversations-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Conversations_1.1.0/sdk/cognitivelanguage/Azure.AI.Language.Conversations/)
GitHub [2.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Conversations_2.0.0-beta.5/sdk/cognitivelanguage/Azure.AI.Language.Conversations/) | | Conversations Authoring | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.AI.Language.Conversations.Authoring/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/AI.Language.Conversations.Authoring-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Conversations.Authoring_1.0.0-beta.3/sdk/cognitivelanguage/Azure.AI.Language.Conversations.Authoring/) | | Core - Client - AMQP | NuGet [1.3.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.3.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.3.1/sdk/core/Azure.Core.Amqp/) | @@ -61,7 +61,7 @@ | Health Insights Cancer Profiling | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Health.Insights.CancerProfiling/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Health.Insights.CancerProfiling-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Insights.CancerProfiling_1.0.0-beta.1/sdk/healthinsights/Azure.Health.Insights.CancerProfiling/) | | Health Insights Clinical Matching | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Health.Insights.ClinicalMatching/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Health.Insights.ClinicalMatching-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Insights.ClinicalMatching_1.0.0-beta.1/sdk/healthinsights/Azure.Health.Insights.ClinicalMatching/) | | Health Insights Radiology Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Health.Insights.RadiologyInsights/1.1.0) | [docs](/dotnet/api/overview/azure/Health.Insights.RadiologyInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Insights.RadiologyInsights_1.1.0/sdk/healthinsights/Azure.Health.Insights.RadiologyInsights/) | -| Identity | NuGet [1.18.0](https://www.nuget.org/packages/Azure.Identity/1.18.0) | [docs](/dotnet/api/overview/azure/Identity-readme) | GitHub [1.18.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.18.0/sdk/identity/Azure.Identity/) | +| Identity | NuGet [1.19.0](https://www.nuget.org/packages/Azure.Identity/1.19.0) | [docs](/dotnet/api/overview/azure/Identity-readme) | GitHub [1.19.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.19.0/sdk/identity/Azure.Identity/) | | Identity Broker | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Identity.Broker/1.4.0) | [docs](/dotnet/api/overview/azure/Identity.Broker-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity.Broker_1.4.0/sdk/identity/Azure.Identity.Broker/) | | Image Analysis | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.Vision.ImageAnalysis/1.0.0) | [docs](/dotnet/api/overview/azure/AI.Vision.ImageAnalysis-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Vision.ImageAnalysis_1.0.0/sdk/vision/Azure.AI.Vision.ImageAnalysis/) | | Key Vault - Administration | NuGet [4.7.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.7.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Administration-readme) | GitHub [4.7.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.7.0/sdk/keyvault/Azure.Security.KeyVault.Administration/) | @@ -159,9 +159,10 @@ | Functions extension for Storage Queues | NuGet [5.3.7](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/5.3.7) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.Storage.Queues-readme) | GitHub [5.3.7](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.Storage.Queues_5.3.7/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/) | | Functions extension for WebPubSub for SocketIO | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO/1.0.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO_1.0.0/sdk/webpubsub/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO/) | | Provisioning - App Configuration | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.AppConfiguration/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.AppConfiguration/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.AppConfiguration-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppConfiguration_1.1.0/sdk/provisioning/Azure.Provisioning.AppConfiguration/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppConfiguration_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.AppConfiguration/) | -| Provisioning - App Containers | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.AppContainers/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.AppContainers/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.AppContainers-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppContainers_1.1.0/sdk/provisioning/Azure.Provisioning.AppContainers/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppContainers_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.AppContainers/) | +| Provisioning - App Containers | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Provisioning.AppContainers/1.2.0) | [docs](/dotnet/api/overview/azure/Provisioning.AppContainers-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppContainers_1.2.0/sdk/provisioning/Azure.Provisioning.AppContainers/) | | Provisioning - App Service | NuGet [1.3.1](https://www.nuget.org/packages/Azure.Provisioning.AppService/1.3.1)
NuGet [1.4.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.AppService/1.4.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.AppService-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppService_1.3.1/sdk/provisioning/Azure.Provisioning.AppService/)
GitHub [1.4.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppService_1.4.0-beta.2/sdk/provisioning/Azure.Provisioning.AppService/) | | Provisioning - Application Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.ApplicationInsights/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.ApplicationInsights/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.ApplicationInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ApplicationInsights_1.1.0/sdk/provisioning/Azure.Provisioning.ApplicationInsights/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ApplicationInsights_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.ApplicationInsights/) | +| Provisioning - Cdn | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Cdn/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Cdn-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Cdn_1.0.0-beta.1/sdk/provisioning/Azure.Provisioning.Cdn/) | | Provisioning - Cognitive Services | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Provisioning.CognitiveServices/1.2.0) | [docs](/dotnet/api/overview/azure/Provisioning.CognitiveServices-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.CognitiveServices_1.2.0/sdk/provisioning/Azure.Provisioning.CognitiveServices/) | | Provisioning - Communication | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Provisioning.Communication/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Provisioning.Communication-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Communication_1.0.0-beta.4/sdk/provisioning/Azure.Provisioning.Communication/) | | Provisioning - Container Registry | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.ContainerRegistry/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.ContainerRegistry-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ContainerRegistry_1.1.0/sdk/provisioning/Azure.Provisioning.ContainerRegistry/) | @@ -237,8 +238,9 @@ | Resource Management - Container Instances | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerInstance/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerInstance-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerInstance_1.3.0/sdk/containerinstance/Azure.ResourceManager.ContainerInstance/) | | Resource Management - Container Orchestrator Runtime | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerOrchestratorRuntime/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerOrchestratorRuntime-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerOrchestratorRuntime_1.0.0-beta.1/sdk/containerorchestratorruntime/Azure.ResourceManager.ContainerOrchestratorRuntime/) | | Resource Management - Container Registry | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry/1.4.0)
NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerRegistry-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry_1.4.0/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry/)
GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry_1.5.0-beta.1/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry/) | -| Resource Management - Container Service | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerService/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerService-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerService_1.3.1/sdk/containerservice/Azure.ResourceManager.ContainerService/) | +| Resource Management - Container Service | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerService/1.3.1)
NuGet [1.4.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerService/1.4.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerService-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerService_1.3.1/sdk/containerservice/Azure.ResourceManager.ContainerService/)
GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerService_1.4.0-beta.1/sdk/containerservice/Azure.ResourceManager.ContainerService/) | | Resource Management - Container Service Fleet | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerServiceFleet/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerServiceFleet/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerServiceFleet-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerServiceFleet_1.1.0/sdk/fleet/Azure.ResourceManager.ContainerServiceFleet/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerServiceFleet_1.2.0-beta.1/sdk/fleet/Azure.ResourceManager.ContainerServiceFleet/) | +| Resource Management - Containerregistry.Tasks | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry.Tasks/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerRegistry.Tasks-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry.Tasks_1.0.0-beta.1/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry.Tasks/) | | Resource Management - Content Delivery Network | NuGet [1.5.1](https://www.nuget.org/packages/Azure.ResourceManager.Cdn/1.5.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Cdn-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Cdn_1.5.1/sdk/cdn/Azure.ResourceManager.Cdn/) | | Resource Management - Cosmos DB | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDB/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.CosmosDB-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDB_1.4.0/sdk/cosmosdb/Azure.ResourceManager.CosmosDB/) | | Resource Management - Cosmos DB for PostgreSQL | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDBForPostgreSql/1.0.0)
NuGet [1.1.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDBForPostgreSql/1.1.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.CosmosDBForPostgreSql-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDBForPostgreSql_1.0.0/sdk/cosmosdbforpostgresql/Azure.ResourceManager.CosmosDBForPostgreSql/)
GitHub [1.1.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDBForPostgreSql_1.1.0-beta.2/sdk/cosmosdbforpostgresql/Azure.ResourceManager.CosmosDBForPostgreSql/) | @@ -271,7 +273,7 @@ | Resource Management - Disconnectedoperations | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DisconnectedOperations/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DisconnectedOperations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DisconnectedOperations_1.0.0/sdk/disconnectedoperations/Azure.ResourceManager.DisconnectedOperations/) | | Resource Management - DNS | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.Dns/1.1.1)
NuGet [1.2.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Dns/1.2.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Dns-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dns_1.1.1/sdk/dns/Azure.ResourceManager.Dns/)
GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dns_1.2.0-beta.2/sdk/dns/Azure.ResourceManager.Dns/) | | Resource Management - DNS Resolver | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.DnsResolver/1.2.0)
NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DnsResolver/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DnsResolver-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DnsResolver_1.2.0/sdk/dnsresolver/Azure.ResourceManager.DnsResolver/)
GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DnsResolver_1.3.0-beta.1/sdk/dnsresolver/Azure.ResourceManager.DnsResolver/) | -| Resource Management - Durabletask | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DurableTask/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DurableTask-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DurableTask_1.0.0/sdk/durabletask/Azure.ResourceManager.DurableTask/) | +| Resource Management - Durabletask | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.DurableTask/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DurableTask-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DurableTask_1.1.0/sdk/durabletask/Azure.ResourceManager.DurableTask/) | | Resource Management - Dynatrace | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Dynatrace/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Dynatrace-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dynatrace_1.2.0/sdk/dynatrace/Azure.ResourceManager.Dynatrace/) | | Resource Management - Edge Order | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.EdgeOrder/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.EdgeOrder-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EdgeOrder_1.1.1/sdk/edgeorder/Azure.ResourceManager.EdgeOrder/) | | Resource Management - Edge Zones | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.EdgeZones/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.EdgeZones-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EdgeZones_1.0.0-beta.2/sdk/edgezones/Azure.ResourceManager.EdgeZones/) | @@ -391,7 +393,7 @@ | Resource Management - Self Help | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.SelfHelp/1.0.0)
NuGet [1.1.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.SelfHelp/1.1.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.SelfHelp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SelfHelp_1.0.0/sdk/selfhelp/Azure.ResourceManager.SelfHelp/)
GitHub [1.1.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SelfHelp_1.1.0-beta.5/sdk/selfhelp/Azure.ResourceManager.SelfHelp/) | | Resource Management - Service Bus | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceBus/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ServiceBus/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceBus-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceBus_1.1.0/sdk/servicebus/Azure.ResourceManager.ServiceBus/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceBus_1.2.0-beta.1/sdk/servicebus/Azure.ResourceManager.ServiceBus/) | | Resource Management - Service Fabric | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabric/1.1.0)
NuGet [1.2.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabric/1.2.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceFabric-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabric_1.1.0/sdk/servicefabric/Azure.ResourceManager.ServiceFabric/)
GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabric_1.2.0-beta.2/sdk/servicefabric/Azure.ResourceManager.ServiceFabric/) | -| Resource Management - Service Fabric Managed Clusters | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabricManagedClusters/1.2.0)
NuGet [1.3.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabricManagedClusters/1.3.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceFabricManagedClusters-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabricManagedClusters_1.2.0/sdk/servicefabricmanagedclusters/Azure.ResourceManager.ServiceFabricManagedClusters/)
GitHub [1.3.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabricManagedClusters_1.3.0-beta.5/sdk/servicefabricmanagedclusters/Azure.ResourceManager.ServiceFabricManagedClusters/) | +| Resource Management - Service Fabric Managed Clusters | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabricManagedClusters/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceFabricManagedClusters-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabricManagedClusters_1.3.0/sdk/servicefabricmanagedclusters/Azure.ResourceManager.ServiceFabricManagedClusters/) | | Resource Management - Service Linker | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.ServiceLinker/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceLinker-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceLinker_1.1.1/sdk/servicelinker/Azure.ResourceManager.ServiceLinker/) | | Resource Management - Service Networking | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceNetworking/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceNetworking-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceNetworking_1.1.0/sdk/servicenetworking/Azure.ResourceManager.ServiceNetworking/) | | Resource Management - Servicegroups | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ServiceGroups/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceGroups-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceGroups_1.0.0-beta.1/sdk/servicegroups/Azure.ResourceManager.ServiceGroups/) | diff --git a/docs/azure/migration/appmod/containerization.md b/docs/azure/migration/appmod/containerization.md index 65b66c0be2702..e696e62db8a00 100644 --- a/docs/azure/migration/appmod/containerization.md +++ b/docs/azure/migration/appmod/containerization.md @@ -1,6 +1,7 @@ --- title: Containerize your project using GitHub Copilot modernization for .NET description: Learn how to containerize your .NET project using GitHub Copilot modernization for .NET. + #customer intent: As a .NET developer, I want to containerize my project using GitHub Copilot modernization so that I can modernize my application efficiently. ms.topic: quickstart ms.custom: devx-track-dotnet @@ -11,7 +12,7 @@ ms.author: donji # Quickstart: Containerize your project using GitHub Copilot modernization for .NET -In this quickstart, you learn how to containerize your project using GitHub Copilot modernization for .NET. The app modernization tooling uses GitHub Copilot's AI capabilities to: +In this quickstart, you learn how to containerize your project using GitHub Copilot modernization for .NET. The modernization tooling uses GitHub Copilot's AI capabilities to: - Analyze your project structure and dependencies - Generate Dockerfile configurations diff --git a/docs/azure/migration/appmod/copilot-cli-support.md b/docs/azure/migration/appmod/copilot-cli-support.md index 1044a7e29863d..b90fb890d601e 100644 --- a/docs/azure/migration/appmod/copilot-cli-support.md +++ b/docs/azure/migration/appmod/copilot-cli-support.md @@ -17,7 +17,7 @@ Learn how to migrate .NET applications to Azure with **GitHub Copilot modernizat > GitHub Copilot CLI is available in the GitHub Copilot Pro, GitHub Copilot Pro+, GitHub Copilot Business, and GitHub Copilot Enterprise plans. > If you receive Copilot through an organization, an admin must enable the Copilot CLI policy in the organization settings. -## Why use Copilot CLI with app modernization +## Why use Copilot CLI with modernization - Run modernization tasks from the terminal - no need to switch to an IDE. - Use interactive (human-in-the-loop) and batch workflows. @@ -37,7 +37,7 @@ Learn how to migrate .NET applications to Azure with **GitHub Copilot modernizat copilot ``` - :::image type="content" source="./media/copilot-cli-entrance.png" lightbox="./media/copilot-cli-entrance.png" alt-text="Screenshot of app modernization entrance in Copilot CLI."::: + :::image type="content" source="./media/copilot-cli-entrance.png" lightbox="./media/copilot-cli-entrance.png" alt-text="Screenshot of modernization entrance in Copilot CLI."::: Copilot asks you to confirm that you trust the files in this folder. For details, see [Using Copilot CLI](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli#trusted-directories). diff --git a/docs/azure/migration/appmod/deploy.md b/docs/azure/migration/appmod/deploy.md index 3f63d9d5f5ffa..ce1f17ca86f6c 100644 --- a/docs/azure/migration/appmod/deploy.md +++ b/docs/azure/migration/appmod/deploy.md @@ -18,7 +18,7 @@ In this quickstart, you learn how to deploy your project to Azure with GitHub Co ## Deploy your project -The App Modernization for .NET deployment feature helps you deploy your migrated app to Azure. Follow these steps to start the deployment process: +The Modernization for .NET deployment feature helps you deploy your migrated app to Azure. Follow these steps to start the deployment process: 1. In Visual Studio, open your migrated project. diff --git a/docs/azure/migration/appmod/includes/quickstart-visual-studio.md b/docs/azure/migration/appmod/includes/quickstart-visual-studio.md index 1fe7128bb1680..b69b35457c2bd 100644 --- a/docs/azure/migration/appmod/includes/quickstart-visual-studio.md +++ b/docs/azure/migration/appmod/includes/quickstart-visual-studio.md @@ -54,7 +54,7 @@ Send the migration task number (for example, 1.1) or its name in the chat. ### Plan and progress tracker generation -- When you start the migration, GitHub Copilot starts a session named "App modernization: migrate from `` to ``" in agent mode with predefined prompts. +- When you start the migration, GitHub Copilot starts a session named "Modernization: migrate from `` to ``" in agent mode with predefined prompts. - The tool creates two files in the `.appmod/.migration` folder: - `plan.md`: The overall migration plan. - `progress.md`: A progress tracker that GitHub Copilot updates as it completes tasks. diff --git a/docs/azure/migration/appmod/includes/quickstart-vscode.md b/docs/azure/migration/appmod/includes/quickstart-vscode.md index fe707c5138093..7c24d1ef88b7f 100644 --- a/docs/azure/migration/appmod/includes/quickstart-vscode.md +++ b/docs/azure/migration/appmod/includes/quickstart-vscode.md @@ -1,7 +1,7 @@ --- ms.topic: include ms.date: 01/26/2026 -title: GitHub Copilot modernization for .NET in VS Code +title: GitHub Copilot Modernization for .NET in VS Code description: Learn how to assess .NET app readiness and migrate to Azure with GitHub Copilot in Visual Studio Code. Follow step-by-step guidance for seamless modernization. --- @@ -109,7 +109,7 @@ Copilot follows the plan and progress tracker to: Repeatedly select or enter **Continue** to confirm the use of tools or commands and wait for the code changes to finish. > [!NOTE] -> In Visual Studio Code, app modernization uses the `AppModernization-DotNet` custom agent with Claude Sonnet 4.5 by default for best results when updating .NET code to migrate to Azure. It falls back to the 'auto' model if Sonnet 4.5 isn't available to you. You can configure the custom agent to [modify the 'model' setting](https://code.visualstudio.com/docs/copilot/customization/custom-agents#_custom-agent-file-structure) by selecting **Configure Custom Agents** from the **Agent** menu. Alternatively, you can use the language model picker in the chat window to switch models for the current chat session. +> In Visual Studio Code, modernization uses the `AppModernization-DotNet` custom agent with Claude Sonnet 4.5 by default for best results when updating .NET code to migrate to Azure. It falls back to the 'auto' model if Sonnet 4.5 isn't available to you. You can configure the custom agent to [modify the 'model' setting](https://code.visualstudio.com/docs/copilot/customization/custom-agents#_custom-agent-file-structure) by selecting **Configure Custom Agents** from the **Agent** menu. Alternatively, you can use the language model picker in the chat window to switch models for the current chat session. ### Validation iteration diff --git a/docs/azure/migration/appmod/predefined-tasks.md b/docs/azure/migration/appmod/predefined-tasks.md index 1ffc14d8c4636..239ebab76a14f 100644 --- a/docs/azure/migration/appmod/predefined-tasks.md +++ b/docs/azure/migration/appmod/predefined-tasks.md @@ -10,7 +10,7 @@ ms.date: 9/17/2025 This article describes the predefined tasks available for GitHub Copilot modernization for .NET. -Predefined tasks capture industry best practices for using Azure services. Currently, App Modernization for .NET offers predefined tasks that cover common migration scenarios. These tasks address the following subjects, and more: +Predefined tasks capture industry best practices for using Azure services. Currently, Modernization for .NET offers predefined tasks that cover common migration scenarios. These tasks address the following subjects, and more: - Database migration - Storage migration @@ -22,7 +22,7 @@ Predefined tasks capture industry best practices for using Azure services. Curre ## Predefined task list -App Modernization for .NET currently supports the following predefined tasks: +Modernization for .NET currently supports the following predefined tasks: - **Migrate to Managed Identity based Database on Azure, including Azure SQL DB, Azure SQL MI and Azure PostgreSQL** diff --git a/docs/azure/migration/appmod/sample.md b/docs/azure/migration/appmod/sample.md index 3f382b3f189bb..a8f0857303630 100644 --- a/docs/azure/migration/appmod/sample.md +++ b/docs/azure/migration/appmod/sample.md @@ -26,7 +26,7 @@ The legacy system relies on Windows-based components: ## Modernization with Azure -Using App Modernization for .NET (Preview), you can update the sample to use modern, cloud-native Azure services: +Using Modernization for .NET (Preview), you can update the sample to use modern, cloud-native Azure services: - **Azure SQL Database** replaces SQL Server LocalDB - **Azure Blob Storage** replaces local file system access diff --git a/docs/core/compatibility/8.0.md b/docs/core/compatibility/8.0.md index a6fe33bc08702..61f1d47a9f262 100644 --- a/docs/core/compatibility/8.0.md +++ b/docs/core/compatibility/8.0.md @@ -80,6 +80,7 @@ See [Breaking changes in EF Core 8](/ef/core/what-is-new/ef-core-8.0/breaking-ch |-----------------------------------------------------------------------------------------------------------------------------------|-------------------| | [ActivatorUtilities.CreateInstance behaves consistently](extensions/8.0/activatorutilities-createinstance-behavior.md) | Behavioral change | | [ActivatorUtilities.CreateInstance requires non-null provider](extensions/8.0/activatorutilities-createinstance-null-provider.md) | Behavioral change | +| [ConfigurationBinder silently skips invalid array elements](extensions/8.0/configurationbinder-skips-failed-array-elements.md) | Behavioral change | | [ConfigurationBinder throws for mismatched value](extensions/8.0/configurationbinder-exceptions.md) | Behavioral change | | [ConfigurationManager package no longer references System.Security.Permissions](extensions/8.0/configurationmanager-package.md) | Source incompatible | | [DirectoryServices package no longer references System.Security.Permissions](extensions/8.0/directoryservices-package.md) | Source incompatible | diff --git a/docs/core/compatibility/extensions/8.0/configurationbinder-exceptions.md b/docs/core/compatibility/extensions/8.0/configurationbinder-exceptions.md index 2b329666327a4..82e56fe6f191c 100644 --- a/docs/core/compatibility/extensions/8.0/configurationbinder-exceptions.md +++ b/docs/core/compatibility/extensions/8.0/configurationbinder-exceptions.md @@ -71,3 +71,7 @@ Alternatively, set - - + +## See also + +- [ConfigurationBinder silently skips invalid array elements](configurationbinder-skips-failed-array-elements.md) diff --git a/docs/core/compatibility/extensions/8.0/configurationbinder-skips-failed-array-elements.md b/docs/core/compatibility/extensions/8.0/configurationbinder-skips-failed-array-elements.md new file mode 100644 index 0000000000000..6a1ed93969de2 --- /dev/null +++ b/docs/core/compatibility/extensions/8.0/configurationbinder-skips-failed-array-elements.md @@ -0,0 +1,79 @@ +--- +title: "Breaking change: ConfigurationBinder silently skips invalid array elements" +description: "Learn about the breaking change in .NET 8 where ConfigurationBinder silently skips array or list elements that fail type conversion instead of preserving null placeholders." +ms.date: 03/11/2026 +ai-usage: ai-assisted +--- + +# ConfigurationBinder silently skips invalid array elements + +Starting in .NET 8, silently skips array and list elements whose values can't be converted to the target type. Previously, failed elements were preserved as `null` placeholders, and the resulting collection retained the same length as the number of elements in the configuration source. + +## Version introduced + +.NET 8 + +## Previous behavior + +Previously, when binding an array or list property via or , if an element's value couldn't be converted to the target type, that element was preserved as a `null` placeholder in the result. The collection length matched the number of elements in the configuration. + +```csharp +// Configuration source, for example, appsettings.json: +// "Items": [ +// { "Name": "A", "Interval": 10 }, +// { "Name": "B", "Interval": "a" } <-- invalid int +// ] + +var settings = configuration.GetSection("Items").Get(); + +// .NET 6/7 result: +// settings.Length == 2 +// settings[0] = { Name = "A", Interval = 10 } +// settings[1] = null (conversion failed, placeholder preserved) +``` + +## New behavior + +Starting in .NET 8, elements that fail type conversion are silently skipped. The resulting collection contains only successfully bound elements and has a shorter length than the number of entries in the configuration source. + +```csharp +var settings = configuration.GetSection("Items").Get(); + +// .NET 8+ result: +// settings.Length == 1 +// settings[0] = { Name = "A", Interval = 10 } +``` + +## Type of breaking change + +This change is a [behavioral change](../../categories.md#behavioral-change). + +## Reason for change + +The internal implementation of was refactored in .NET 8. Instead of pre-allocating the target array and binding elements in-place (which left `null` on conversion failure), the binder now collects only successfully bound elements into a temporary list before materializing the final array. + +The previous behavior was also problematic for value types such as `int[]`. For an invalid configuration value, the binder would store `0`, which was indistinguishable from a legitimate value of `0`. The new behavior avoids this ambiguity. + +## Recommended action + +- **Enable during development** to surface invalid configuration values immediately rather than silently dropping elements: + + ```csharp + var settings = configuration.GetSection("Items").Get(options => + options.ErrorOnUnknownConfiguration = true); + ``` + + Starting in .NET 8, this option also causes to throw an when a value can't be converted to the target type. For more information, see [ConfigurationBinder throws for mismatched value](configurationbinder-exceptions.md). + +- **Fix invalid configuration values.** Ensure all values in your configuration source match the expected types for the bound model. + +- **Validate collection lengths** after binding if your code depends on the number of elements matching the configuration source. + +- **Use string properties with manual parsing** if you need to gracefully handle unconvertible values and preserve all array entries. + +## Affected APIs + +- +- +- +- diff --git a/docs/core/compatibility/globalization/5.0/icu-globalization-api.md b/docs/core/compatibility/globalization/5.0/icu-globalization-api.md index 6d1a2f266c37a..35a6d639f0aa7 100644 --- a/docs/core/compatibility/globalization/5.0/icu-globalization-api.md +++ b/docs/core/compatibility/globalization/5.0/icu-globalization-api.md @@ -1,7 +1,8 @@ --- title: "Breaking change: Globalization APIs use ICU libraries on Windows 10" description: Learn about the globalization breaking change in .NET 5 where ICU libraries are used for globalization functionality instead of NLS on Windows 10. -ms.date: 02/15/2022 +ms.date: 03/10/2026 +ai-usage: ai-assisted --- # Globalization APIs use ICU libraries on Windows 10 @@ -52,6 +53,21 @@ string text = string.Format("{0:C}", 100); - In .NET Core 3.1 and earlier versions on Windows, the value of text is `"100,00 €"`. - In .NET 5 and later versions on Windows 19H1 and later versions, the value of text is `"100,00 ¤"`, which uses the international currency symbol instead of the euro. In ICU, the design is that a currency is a property of a country or region, not a language. +### IdnMapping.GetAscii + +Consider the following code that calls to convert an internationalized domain name label to its ASCII-compatible encoding. + +```csharp +var mapping = new System.Globalization.IdnMapping(); +string asciiName = mapping.GetAscii("ABCDEFG"); +Console.WriteLine(asciiName); +``` + +- In .NET Core 3.1 and earlier versions on Windows, the snippet prints `ABCDEFG`. +- In .NET 5 and later versions on Windows 10 May 2019 Update and later versions, the snippet prints `abcdefg`. + +ICU lowercases domain name labels as part of the ASCII-compatible encoding process. NLS doesn't lowercase labels that contain no international characters, so the original casing is preserved. + ### Day-of-week abbreviations The method obtains the shortest abbreviated day name for a specified day of the week. diff --git a/docs/core/compatibility/toc.yml b/docs/core/compatibility/toc.yml index 060aa02d24c20..748675af35f84 100644 --- a/docs/core/compatibility/toc.yml +++ b/docs/core/compatibility/toc.yml @@ -460,6 +460,8 @@ items: href: extensions/8.0/activatorutilities-createinstance-behavior.md - name: ActivatorUtilities.CreateInstance requires non-null provider href: extensions/8.0/activatorutilities-createinstance-null-provider.md + - name: ConfigurationBinder silently skips invalid array elements + href: extensions/8.0/configurationbinder-skips-failed-array-elements.md - name: ConfigurationBinder throws for mismatched value href: extensions/8.0/configurationbinder-exceptions.md - name: ConfigurationManager package no longer references System.Security.Permissions diff --git a/docs/core/diagnostics/dotnet-trace.md b/docs/core/diagnostics/dotnet-trace.md index 227e1be1d89f0..ad583fc0a3355 100644 --- a/docs/core/diagnostics/dotnet-trace.md +++ b/docs/core/diagnostics/dotnet-trace.md @@ -1,7 +1,7 @@ --- title: dotnet-trace diagnostic tool - .NET CLI description: Learn how to install and use the dotnet-trace CLI tool to collect .NET traces of a running process without the native profiler, by using the .NET EventPipe. -ms.date: 05/12/2025 +ms.date: 03/11/2026 ms.topic: reference ms.custom: sfi-ropc-nochange --- @@ -40,9 +40,9 @@ dotnet-trace [-h, --help] [--version] The `dotnet-trace` tool: -- Is a cross-platform .NET Core tool. -- Enables the collection of .NET Core traces of a running process without a native profiler. -- Is built on [`EventPipe`](./eventpipe.md) of the .NET Core runtime. +- Is a cross-platform .NET diagnostic tool. +- Enables the collection of .NET traces of a running process without a native profiler. +- Is built on [`EventPipe`](./eventpipe.md) of the .NET runtime. - Supports two different ways of collecting traces: - The [`collect` verb](#dotnet-trace-collect) offers consistent functionality on any OS. @@ -51,7 +51,7 @@ The `dotnet-trace` tool: | Feature | `collect` | `collect-linux` | |------------------------------------------|----------|-----------------------------------| | Supported OS | Any | Linux only, kernel version >= 6.4 | - | Requires Admin/Root Privilege | No | Yes | + | Requires Admin/Root privilege | No | Yes | | Trace all processes simultaneously | No | Supported | | Capture native library and kernel events | No | Supported | | Event callstacks include native frames | No | Yes | @@ -279,14 +279,11 @@ dotnet-trace collect A string, parsed as [payload_field_name]:[payload_field_value] pairs separated by commas, that will stop the trace upon hitting an event containing all specified payload pairs. Requires `--stopping-event-provider-name` and `--stopping-event-event-name` to be set. for example, `--stopping-event-provider-name Microsoft-Windows-DotNETRuntime --stopping-event-event-name Method/JittingStarted --stopping-event-payload-filter MethodNameSpace:Program,MethodName:OnButtonClick` to stop the trace upon the first `Method/JittingStarted` event for the method `OnButtonClick` in the `Program` namespace emitted by the `Microsoft-Windows-DotNETRuntime` event provider. > [!NOTE] - -> - Stopping the trace may take a long time (up to minutes) for large applications. The runtime needs to send over the type cache for all managed code that was captured in the trace. - +> +> - Stopping the trace might take a long time (up to minutes) for large applications. The runtime needs to send over the type cache for all managed code that was captured in the trace. > - To collect a trace using `dotnet-trace`, it needs to be run as the same user as the user running the target process or as root. Otherwise, the tool will fail to establish a connection with the target process. - > - If you experience an unhandled exception while running `dotnet-trace collect`, this results in an incomplete trace. If finding the root cause of the exception is your priority, navigate to [Collect dumps on crash](collect-dumps-crash.md). As a result of the unhandled exception, the trace is truncated when the runtime shuts down to prevent other undesired behavior such as a hang or data corruption. Even though the trace is incomplete, you can still open it to see what happened leading up to the failure. However, it will be missing Rundown information (this happens at the end of a trace) so stacks might be unresolved (depending on what providers were turned on). Open the trace by executing PerfView with the `/ContinueOnError` flag at the command line. The logs will also contain the location the exception was fired. - -> - When specifying a stopping event through the `--stopping-event-*` options, as the EventStream is being parsed asynchronously, there will be some events that pass through between the time a trace event matching the specified stopping event options is parsed and the EventPipeSession is stopped. +> - When you specify a stopping event through the `--stopping-event-*` options, as the EventStream is being parsed asynchronously, there will be some events that pass through between the time a trace event matching the specified stopping event options is parsed and the EventPipeSession is stopped. ## dotnet-trace collect-linux @@ -310,7 +307,7 @@ Collects diagnostic traces using perf_events, a Linux OS technology. `collect-li - .NET 10+ > [!NOTE] -> The `collect-linux` verb only runs on linux x64 and linux arm64 environments that have glibc version 2.35 or above. +> The `collect-linux` verb only runs on Linux x64 and Linux Arm64 environments that have glibc version 2.35 or later. > All of the [.NET 10 officially supported Linux distros](https://github.com/dotnet/core/blob/main/release-notes/10.0/supported-os.md#linux) support this requirement except Alpine 3.22, CentOS Stream 9, and any distros based off Red Hat Enterprise Linux 9. > A quick way to check the version of a system's libc is with the command `ldd --version` or by executing the libc library directly. @@ -448,7 +445,7 @@ By default, all processes on the machine are traced. To trace only one process, | `gc-collect` | Tracks GC collections only at very low overhead. | | `database` | Captures ADO.NET and Entity Framework database commands. | -#### Trace Collection Options +#### Trace collection options - **`-o|--output `** @@ -458,7 +455,7 @@ By default, all processes on the machine are traced. To trace only one process, The time for the trace to run. Use the `dd:hh:mm:ss` format. For example `00:00:00:05` will run it for 5 seconds. -#### .NET Process Target Options +#### .NET process target options See [Default collection behavior](#default-collection-behavior) @@ -517,7 +514,7 @@ dotnet-trace convert [] [--format `dotnet-trace` 6.0.320703 and later, also display the command-line arguments that each process was started with, if available. > [!NOTE] -> To get full information for enumerated 64 bit processes, you need to use a 64-bit version of the `dotnet-trace` tool. +> To get full information for enumerated 64-bit processes, you need to use a 64-bit version of the `dotnet-trace` tool. ### Synopsis @@ -592,7 +589,7 @@ Output the parameters of each method in full. If not specified, parameters will To collect traces using `dotnet-trace collect`: -- Get the process identifier (PID) of the .NET Core application to collect traces from. +- Get the process identifier (PID) of the .NET application to collect traces from. - On Windows, you can use Task Manager or the `tasklist` command, for example. - On Linux, for example, the `ps` command. @@ -626,9 +623,9 @@ To collect traces using `dotnet-trace collect`: ## Launch a child application and collect a trace from its startup using dotnet-trace -Sometimes it may be useful to collect a trace of a process from its startup. For apps running .NET 5 or later, it is possible to do this by using dotnet-trace. +Sometimes it might be useful to collect a trace of a process from its startup. For apps running .NET 5 or later, it's possible to do this by using dotnet-trace. -This will launch `hello.exe` with `arg1` and `arg2` as its command-line arguments and collect a trace from its runtime startup: +The following command launches `hello.exe` with `arg1` and `arg2` as its command-line arguments and collects a trace from its runtime startup: ```dotnetcli dotnet-trace collect -- hello.exe arg1 arg2 @@ -651,12 +648,12 @@ Output File : E:\temp\gcperfsim\trace.nettrace Press or to exit... ``` -You can stop collecting the trace by pressing `` or `` key. Doing this will also exit `hello.exe`. +You can stop collecting the trace by pressing Enter or Ctrl + C. Doing this also exits `hello.exe`. > [!NOTE] -> Launching `hello.exe` via dotnet-trace will redirect its input/output and you won't be able to interact with it on the console by default. Use the `--show-child-io` switch to interact with its stdin/stdout. -> Exiting the tool via CTRL+C or SIGTERM will safely end both the tool and the child process. -> If the child process exits before the tool, the tool will exit as well and the trace should be safely viewable. +> Launching `hello.exe` via dotnet-trace redirects its input/output and you won't be able to interact with it on the console by default. Use the `--show-child-io` switch to interact with its stdin/stdout. +> Exiting the tool via Ctrl + C or SIGTERM safely ends both the tool and the child process. +> If the child process exits before the tool, the tool exits as well and the trace should be safely viewable. ## Use diagnostic port to collect a trace from app startup @@ -666,36 +663,36 @@ Using `dotnet-trace -- ` to launch the application as However, when you want to gain a finer control over the lifetime of the app being traced (for example, monitor the app for the first 10 minutes only and continue executing) or if you need to interact with the app using the CLI, using `--diagnostic-port` option allows you to control both the target app being monitored and `dotnet-trace`. -1. The command below makes `dotnet-trace` create a diagnostics socket named `myport.sock` and wait for a connection. +1. The following command makes `dotnet-trace` create a diagnostics socket named `myport.sock` and wait for a connection. - > ```dotnetcli - > dotnet-trace collect --diagnostic-port myport.sock - > ``` + ```dotnetcli + dotnet-trace collect --diagnostic-port myport.sock + ``` - Output: + Output: - > ```output - > Waiting for connection on myport.sock - > Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock - > ``` + ```output + Waiting for connection on myport.sock + Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock + ``` 2. In a separate console, launch the target application with the environment variable `DOTNET_DiagnosticPorts` set to the value in the `dotnet-trace` output. - > ```console - > export DOTNET_DiagnosticPorts=/home/user/myport.sock - > ./my-dotnet-app arg1 arg2 - > ``` + ```console + export DOTNET_DiagnosticPorts=/home/user/myport.sock + ./my-dotnet-app arg1 arg2 + ``` - This should then enable `dotnet-trace` to start tracing `my-dotnet-app`: + This should then enable `dotnet-trace` to start tracing `my-dotnet-app`: - > ```output - > Waiting for connection on myport.sock - > Start an application with the following environment variable: DOTNET_DiagnosticPorts=myport.sock - > Starting a counter session. Press Q to quit. - > ``` + ```output + Waiting for connection on myport.sock + Start an application with the following environment variable: DOTNET_DiagnosticPorts=myport.sock + Starting a counter session. Press Q to quit. + ``` - > [!IMPORTANT] - > Launching your app with `dotnet run` can be problematic because the dotnet CLI may spawn many child processes that are not your app and they can connect to `dotnet-trace` before your app, leaving your app to be suspended at runtime. It is recommended you directly use a self-contained version of the app or use `dotnet exec` to launch the application. + > [!IMPORTANT] + > Launching your app with `dotnet run` can be problematic because the dotnet CLI may spawn many child processes that are not your app and they can connect to `dotnet-trace` before your app, leaving your app to be suspended at runtime. It is recommended you directly use a self-contained version of the app or use `dotnet exec` to launch the application. ## (Linux-only) Collect a machine-wide trace using dotnet-trace diff --git a/docs/core/introduction.md b/docs/core/introduction.md index eae1e2a028f8f..73344178b4cbe 100644 --- a/docs/core/introduction.md +++ b/docs/core/introduction.md @@ -1,21 +1,22 @@ --- title: Introduction to .NET description: Learn about .NET. .NET is a free, open-source development platform for building many kinds of apps. -ms.date: 1/5/2024 +ms.date: 03/10/2026 ms.custom: "updateeachrelease" +ai-usage: ai-assisted --- # Introduction to .NET -.NET is a free, cross-platform, [open-source developer platform](https://github.com/dotnet/core) for building [many kinds of applications](apps.md). It can run programs written in [multiple languages](../fundamentals/languages.md), with [C#](../csharp/index.yml) being the most popular. It relies on a [high-performance](https://devblogs.microsoft.com/dotnet/category/performance/) runtime that is used in production by many [high-scale apps](https://devblogs.microsoft.com/dotnet/category/developer-stories/). +.NET is a free, cross-platform, [open-source developer platform](https://github.com/dotnet/core) for building [many kinds of applications](apps.md). It can run programs written in [multiple languages](../fundamentals/languages.md), with [C#](../csharp/index.yml) being the most popular. It relies on a [high-performance](https://devblogs.microsoft.com/dotnet/category/performance/) runtime used in production by many [high-scale apps](https://devblogs.microsoft.com/dotnet/category/developer-stories/). To learn how to [download .NET](https://dotnet.microsoft.com/download/) and start writing your first app, see [Getting started](./get-started.md). -The .NET platform has been designed to deliver productivity, performance, security, and reliability. It provides automatic memory management via a [garbage collector (GC)](../standard/automatic-memory-management.md). It is type-safe and memory-safe, due to using a GC and strict language compilers. It offers [concurrency](../csharp/asynchronous-programming/index.md) via `async`/`await` and `Task` primitives. It includes a large set of libraries that have broad functionality and have been optimized for performance on multiple operating systems and chip architectures. +The .NET platform is designed to deliver productivity, performance, security, and reliability. It provides automatic memory management via a [garbage collector (GC)](../standard/automatic-memory-management.md). It's type-safe and memory-safe, because it uses a GC and strict language compilers. It offers [concurrency](../csharp/asynchronous-programming/index.md) via `async`/`await` and `Task` primitives. It includes a large set of libraries that have broad functionality and that are optimized for performance on multiple operating systems and chip architectures. .NET has the following [design points](https://devblogs.microsoft.com/dotnet/why-dotnet/): * **Productivity is full-stack** with runtime, libraries, languages, and tools all contributing to developer user experience. -* **Safe code** is the primary compute model, while [unsafe code](../csharp/language-reference/unsafe-code.md) enables additional manual optimizations. +* **Safe code** is the primary compute model, while [unsafe code](../csharp/language-reference/unsafe-code.md) enables more manual optimizations. * **Static and dynamic code** are both supported, enabling a broad set of distinct scenarios. * **Native code interop and hardware intrinsics** are low cost and high-fidelity (raw API and instruction access). * **Code is portable across platforms** (OS and chip architecture), while platform targeting enables specialization and optimization. @@ -28,11 +29,11 @@ The .NET platform has been designed to deliver productivity, performance, securi .NET includes the following components: -- Runtime -- executes application code. -- Libraries -- provides utility functionality like [JSON parsing](../standard/serialization/system-text-json/overview.md). -- Compiler -- compiles C# (and other languages) source code into (runtime) executable code. -- SDK and other tools -- enable building and monitoring apps with modern workflows. -- App stacks -- like ASP.NET Core and Windows Forms, that enable writing apps. +- Runtime — executes application code. +- Libraries — provide utility functionality like [JSON parsing](../standard/serialization/system-text-json/overview.md). +- Compiler — compiles C# (and other languages) source code into (runtime) executable code. +- SDK and other tools — enable building and monitoring apps with modern workflows. +- App stacks — like ASP.NET Core and Windows Forms that enable writing apps. The runtime, libraries, and languages are the pillars of the .NET stack. Higher-level components, like .NET tools, and app stacks, like ASP.NET Core, build on top of these pillars. C# is the primary programming language for .NET and much of .NET is written in C#. @@ -54,7 +55,7 @@ Exceptions are the primary error handling model in .NET. Exceptions have the ben App stacks, like ASP.NET Core and Windows Forms, build on and take advantage of low-level libraries, language, and runtime. The app stacks define the way that apps are constructed and their lifecycle of execution. -The SDK and other tools enable a modern developer experience, both on a developer desktop and for continuous integration (CI). The modern developer experience includes being able to build, analyze, and test code. .NET projects can often be built by a single `dotnet build` command, which orchestrates restoring NuGet packages and building dependencies. +The SDK and other tools enable a modern developer experience, both on a developer desktop and for continuous integration (CI). The modern developer experience includes building, analyzing, and testing code. .NET projects can often be built by a single `dotnet build` command, which orchestrates restoring NuGet packages and building dependencies. NuGet is the package manager for .NET. It contains hundreds of thousands of packages that implement functionality for many scenarios. A majority of apps rely on NuGet packages for some functionality. The [NuGet Gallery](https://nuget.org/) is maintained by Microsoft. @@ -62,23 +63,23 @@ NuGet is the package manager for .NET. It contains hundreds of thousands of pack .NET is free, open source, and is a [.NET Foundation](https://dotnetfoundation.org/) project. .NET is maintained by Microsoft and the community on GitHub in [several repositories](https://github.com/dotnet/core/blob/main/Documentation/core-repos.md). -.NET source and binaries are licensed with the [MIT license](https://github.com/dotnet/runtime/blob/main/LICENSE.TXT). Additional [licenses apply on Windows](https://github.com/dotnet/core/blob/main/license-information-windows.md). +.NET source and binaries are licensed with the [MIT license](https://github.com/dotnet/runtime/blob/main/LICENSE.TXT). Other [licenses apply on Windows](https://github.com/dotnet/core/blob/main/license-information-windows.md). ## Support .NET is [supported by multiple organizations](https://github.com/dotnet/core/blob/main/support.md) that work to ensure that .NET can run on [multiple operating systems](https://github.com/dotnet/core/blob/main/os-lifecycle-policy.md) and is kept up to date. It can be used on Arm64, x64, and x86 architectures. -New versions of .NET are released annually in November, per our [releases and support policies](releases-and-support.md). It is [updated monthly](https://github.com/dotnet/announcements/labels/Monthly-Update) on Patch Tuesday (second Tuesday), typically at 10 AM Pacific time. +New versions of .NET are released annually in November, per the [releases and support policies](releases-and-support.md). It's [updated monthly](https://github.com/dotnet/announcements/labels/Monthly-Update) on Patch Tuesday (second Tuesday), typically at 10 AM Pacific time. ## .NET ecosystem -There are multiple variants of .NET, each supporting a different type of app. The reason for multiple variants is part historical, part technical. +Multiple variants of .NET exist, each supporting a different type of app for both historical and technical reasons. .NET implementations: -* **.NET (Core)** -- Modern .NET. A cross-platform and open source implementation of .NET, rethought for the cloud age while remaining significantly compatible. It is evolving and actively supported. -* **.NET Framework** -- The original .NET. It provides access to the broad capabilities of Windows and Windows Server. It is actively supported, in maintenance. -* **Mono** -- The original community and open source .NET. A cross-platform implementation of .NET Framework. +* **.NET (Core)** — Modern .NET. A cross-platform and open-source implementation of .NET, rethought for the cloud age while remaining significantly compatible. It's evolving and actively supported. +* **.NET Framework** — The original .NET. It provides access to the broad capabilities of Windows and Windows Server. It's actively supported, in maintenance. +* **Mono** — The original community and open-source .NET. A cross-platform implementation of .NET Framework. ## Next steps diff --git a/docs/csharp/advanced-topics/interface-implementation/snippets/staticinterfaces/Describable.cs b/docs/csharp/advanced-topics/interface-implementation/snippets/staticinterfaces/Describable.cs new file mode 100644 index 0000000000000..4c42ab1714287 --- /dev/null +++ b/docs/csharp/advanced-topics/interface-implementation/snippets/staticinterfaces/Describable.cs @@ -0,0 +1,7 @@ +// +public interface IDescribable where T : IDescribable +{ + static abstract string TypeName { get; } + static virtual string Describe() => T.TypeName; +} +// diff --git a/docs/csharp/advanced-topics/interface-implementation/snippets/staticinterfaces/Gadget.cs b/docs/csharp/advanced-topics/interface-implementation/snippets/staticinterfaces/Gadget.cs new file mode 100644 index 0000000000000..1dde95c6c9b95 --- /dev/null +++ b/docs/csharp/advanced-topics/interface-implementation/snippets/staticinterfaces/Gadget.cs @@ -0,0 +1,9 @@ +// +public struct Gadget : IDescribable +{ + public static string TypeName => "Gadget"; + + // Overrides the default Describe() with a custom message + public static string Describe() => $"{TypeName} (version 2.0)"; +} +// diff --git a/docs/csharp/advanced-topics/interface-implementation/snippets/staticinterfaces/Program.cs b/docs/csharp/advanced-topics/interface-implementation/snippets/staticinterfaces/Program.cs index f7b7c9721cc50..1c863fcdbf767 100644 --- a/docs/csharp/advanced-topics/interface-implementation/snippets/staticinterfaces/Program.cs +++ b/docs/csharp/advanced-topics/interface-implementation/snippets/staticinterfaces/Program.cs @@ -7,6 +7,16 @@ Console.WriteLine(str++); // +// +static void PrintDescription() where T : IDescribable +{ + Console.WriteLine(T.Describe()); +} + +PrintDescription(); +PrintDescription(); +// + // var pt = new Point(3, 4); diff --git a/docs/csharp/advanced-topics/interface-implementation/snippets/staticinterfaces/Widget.cs b/docs/csharp/advanced-topics/interface-implementation/snippets/staticinterfaces/Widget.cs new file mode 100644 index 0000000000000..83aa0c48399b3 --- /dev/null +++ b/docs/csharp/advanced-topics/interface-implementation/snippets/staticinterfaces/Widget.cs @@ -0,0 +1,8 @@ +// +public struct Widget : IDescribable +{ + public static string TypeName => "Widget"; + + // Uses the default Describe(): returns "Widget" +} +// diff --git a/docs/csharp/advanced-topics/interface-implementation/static-virtual-interface-members.md b/docs/csharp/advanced-topics/interface-implementation/static-virtual-interface-members.md index c4131a86b196a..f6d38a98ffd8d 100644 --- a/docs/csharp/advanced-topics/interface-implementation/static-virtual-interface-members.md +++ b/docs/csharp/advanced-topics/interface-implementation/static-virtual-interface-members.md @@ -12,8 +12,9 @@ In this tutorial, you learn how to: > [!div class="checklist"] > -> * Define interfaces with static members. +> * Define interfaces with static abstract and static virtual members. > * Use interfaces to define classes that implement interfaces with operators defined. +> * Provide default implementations with static virtual methods. > * Create generic algorithms that rely on static interface methods. ## Prerequisites @@ -66,6 +67,35 @@ AAAAAAAAAA This small example demonstrates the motivation for this feature. You can use natural syntax for operators, constant values, and other static operations. You can explore these techniques when you create multiple types that rely on static members, including overloaded operators. Define the interfaces that match your types' capabilities and then declare those types' support for the new interface. +## Static virtual interface methods + +The previous example used `static abstract` to declare the `++` operator: every implementing type *must* provide its own implementation. You can also declare `static virtual` members that provide a default implementation. Implementing types can use the default or override it. This distinction is useful when there's a reasonable default that works for most types, but some types need specialized behavior. + +The following example defines an `IDescribable` interface with a `static abstract` property, `TypeName`, and a `static virtual` method, `Describe()`. The `TypeName` property is abstract because each type must supply its own name. The `Describe()` method is virtual because returning the type name is a sensisble default for most types: + +:::code language="csharp" source="./snippets/staticinterfaces/Describable.cs" id="Describable"::: + +A type that implements `IDescribable` must provide `TypeName`. It can choose whether to override `Describe()`. The `Widget` type relies on the default: + +:::code language="csharp" source="./snippets/staticinterfaces/Widget.cs" id="Widget"::: + +The `Gadget` type overrides `Describe()` to include additional detail: + +:::code language="csharp" source="./snippets/staticinterfaces/Gadget.cs" id="Gadget"::: + +You call `static virtual` members through the type parameter in a generic method, just like `static abstract` members: + +:::code language="csharp" source="./snippets/staticinterfaces/Program.cs" id="TestDescribe"::: + +The preceding example produces the following output: + +```powershell +Widget +Gadget (version 2.0) +``` + +`Widget` uses the default implementation of `Describe()`, which returns `TypeName`. `Gadget` overrides `Describe()` with its own version. The compiler resolves the correct implementation at compile time based on the type argument. In summary, use `static abstract` when every implementing type must provide its own implementation. Use `static virtual` when you can provide a useful default that most types will accept. + ## Generic math The motivating scenario for allowing static methods, including operators, in interfaces is to support [generic math](../../../standard/generics/math.md) algorithms. The .NET 7 base class library contains interface definitions for many arithmetic operators, and derived interfaces that combine many arithmetic operators in an `INumber` interface. Let's apply those types to build a `Point` record that can use any numeric type for `T`. You can move the point by some `XOffset` and `YOffset` using the `+` operator. diff --git a/docs/orleans/host/snippets/transport-layer-security/.gitignore b/docs/orleans/host/snippets/transport-layer-security/.gitignore new file mode 100644 index 0000000000000..cd42ee34e873b --- /dev/null +++ b/docs/orleans/host/snippets/transport-layer-security/.gitignore @@ -0,0 +1,2 @@ +bin/ +obj/ diff --git a/docs/orleans/host/snippets/transport-layer-security/README.md b/docs/orleans/host/snippets/transport-layer-security/README.md new file mode 100644 index 0000000000000..385002b3d4023 --- /dev/null +++ b/docs/orleans/host/snippets/transport-layer-security/README.md @@ -0,0 +1,14 @@ +# Orleans transport layer security snippets + +This folder contains the runnable snippet projects used by `docs/orleans/host/transport-layer-security.md`. + +## Run the sample locally + +1. Open a terminal in `docs/orleans/host/snippets/transport-layer-security/csharp/SiloExample`. +2. Run `dotnet build` and then `dotnet run`. +3. Open a second terminal in `docs/orleans/host/snippets/transport-layer-security/csharp/ClientExample`. +4. Run `dotnet build` and then `dotnet run`. + +The executable entry points create temporary self-signed certificates in memory and configure Orleans for development-only certificate validation so the sample can run locally without any certificate store setup. The generated certificate is loaded into user key storage so Windows TLS can use it for the server-side handshake. + +The inline snippets in each `Program.cs` file remain focused on the certificate store and certificate file configuration patterns described in the article. diff --git a/docs/orleans/host/snippets/transport-layer-security/csharp/ClientExample/ClientExample.csproj b/docs/orleans/host/snippets/transport-layer-security/csharp/ClientExample/ClientExample.csproj new file mode 100644 index 0000000000000..e5637595d86d0 --- /dev/null +++ b/docs/orleans/host/snippets/transport-layer-security/csharp/ClientExample/ClientExample.csproj @@ -0,0 +1,15 @@ + + + + Exe + net10.0 + enable + enable + + + + + + + + diff --git a/docs/orleans/host/snippets/transport-layer-security/csharp/ClientExample/Program.cs b/docs/orleans/host/snippets/transport-layer-security/csharp/ClientExample/Program.cs new file mode 100644 index 0000000000000..2a00d5e010a25 --- /dev/null +++ b/docs/orleans/host/snippets/transport-layer-security/csharp/ClientExample/Program.cs @@ -0,0 +1,162 @@ +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Orleans.Connections.Security; +using Orleans.Hosting; + +using var certificate = SampleCertificates.CreateDevelopmentCertificate("localhost"); +using IHost host = Host.CreateDefaultBuilder(args) + .UseEnvironment(Environments.Development) + .UseOrleansClient(builder => + { + builder + .UseLocalhostClustering() + .UseTls(certificate, options => + { + options.AllowAnyRemoteCertificate(); + options.OnAuthenticateAsClient = (connection, sslOptions) => + { + sslOptions.TargetHost = "localhost"; + }; + }); + }) + .ConfigureLogging(logging => logging.AddConsole()) + .Build(); + +await host.StartAsync(); +Console.WriteLine("ClientExample connected with development TLS. Press Ctrl+C to exit."); +await host.WaitForShutdownAsync(); + +class BasicClientExample +{ + public static async Task ConfigureBasicTls() + { + // + using IHost host = Host.CreateDefaultBuilder() + .UseOrleansClient(builder => + { + builder + .UseLocalhostClustering() + .UseTls(StoreName.My, "my-certificate-subject", allowInvalid: false, StoreLocation.CurrentUser, options => + { + options.OnAuthenticateAsClient = (connection, sslOptions) => + { + sslOptions.TargetHost = "my-certificate-subject"; + }; + }); + }) + .ConfigureLogging(logging => logging.AddConsole()) + .Build(); + + await host.RunAsync(); + // + } +} + +class ClientDevelopmentExample +{ + public static async Task ConfigureDevelopmentTls() + { + // + var hostBuilder = Host.CreateDefaultBuilder() + .UseEnvironment(Environments.Development); + + using IHost host = hostBuilder + .UseOrleansClient((context, builder) => + { + var isDevelopment = context.HostingEnvironment.IsDevelopment(); + + builder + .UseLocalhostClustering() + .UseTls(StoreName.My, "localhost", allowInvalid: isDevelopment, StoreLocation.CurrentUser, options => + { + if (isDevelopment) + { + options.AllowAnyRemoteCertificate(); + } + + options.OnAuthenticateAsClient = (connection, sslOptions) => + { + sslOptions.TargetHost = "localhost"; + }; + }); + }) + .ConfigureLogging(logging => logging.AddConsole()) + .Build(); + + await host.RunAsync(); + // + } +} + +class ClientCertificateExample +{ + public static async Task ConfigureTlsWithCertificate() + { + // + using var cert = X509CertificateLoader.LoadPkcs12FromFile("path/to/certificate.pfx", "password"); + + using IHost host = Host.CreateDefaultBuilder() + .UseOrleansClient(builder => + { + builder + .UseLocalhostClustering() + .UseTls(cert, options => + { + options.OnAuthenticateAsClient = (connection, sslOptions) => + { + sslOptions.TargetHost = cert.GetNameInfo(X509NameType.DnsName, false) ?? "my-certificate-subject"; + }; + }); + }) + .ConfigureLogging(logging => logging.AddConsole()) + .Build(); + + await host.RunAsync(); + // + } +} + +static class SampleCertificates +{ + public static X509Certificate2 CreateDevelopmentCertificate(string dnsName) + { + using var rsa = RSA.Create(2048); + + var request = new CertificateRequest( + $"CN={dnsName}", + rsa, + HashAlgorithmName.SHA256, + RSASignaturePadding.Pkcs1); + + request.CertificateExtensions.Add(new X509BasicConstraintsExtension(false, false, 0, false)); + request.CertificateExtensions.Add(new X509KeyUsageExtension( + X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.KeyEncipherment, + critical: true)); + request.CertificateExtensions.Add(new X509SubjectKeyIdentifierExtension(request.PublicKey, false)); + + var subjectAlternativeNames = new SubjectAlternativeNameBuilder(); + subjectAlternativeNames.AddDnsName(dnsName); + request.CertificateExtensions.Add(subjectAlternativeNames.Build()); + + var usages = new OidCollection + { + new("1.3.6.1.5.5.7.3.1"), + new("1.3.6.1.5.5.7.3.2"), + }; + request.CertificateExtensions.Add(new X509EnhancedKeyUsageExtension(usages, critical: true)); + + using var created = request.CreateSelfSigned( + DateTimeOffset.UtcNow.AddDays(-1), + DateTimeOffset.UtcNow.AddDays(30)); + + var password = Guid.NewGuid().ToString("N"); + // Windows server-side TLS requires a key container instead of an ephemeral key. + return X509CertificateLoader.LoadPkcs12( + created.Export(X509ContentType.Pfx, password), + password, + X509KeyStorageFlags.Exportable | X509KeyStorageFlags.UserKeySet, + Pkcs12LoaderLimits.Defaults); + } +} diff --git a/docs/orleans/host/snippets/transport-layer-security/csharp/SiloExample/Program.cs b/docs/orleans/host/snippets/transport-layer-security/csharp/SiloExample/Program.cs new file mode 100644 index 0000000000000..00cb1d8e21184 --- /dev/null +++ b/docs/orleans/host/snippets/transport-layer-security/csharp/SiloExample/Program.cs @@ -0,0 +1,207 @@ +using System.Net.Security; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Orleans.Connections.Security; +using Orleans.Hosting; + +using var certificate = SampleCertificates.CreateDevelopmentCertificate("localhost"); +using IHost host = Host.CreateDefaultBuilder(args) + .UseEnvironment(Environments.Development) + .UseOrleans(builder => + { + builder + .UseLocalhostClustering() + .UseTls(certificate, options => + { + options.AllowAnyRemoteCertificate(); + options.OnAuthenticateAsClient = (connection, sslOptions) => + { + sslOptions.TargetHost = "localhost"; + }; + }); + }) + .ConfigureLogging(logging => logging.AddConsole()) + .Build(); + +await host.StartAsync(); +Console.WriteLine("SiloExample started with development TLS. Press Ctrl+C to exit."); +await host.WaitForShutdownAsync(); + +class BasicExample +{ + public static async Task ConfigureBasicTls() + { + // + using IHost host = Host.CreateDefaultBuilder() + .UseOrleans(builder => + { + builder + .UseLocalhostClustering() + .UseTls(StoreName.My, "my-certificate-subject", allowInvalid: false, StoreLocation.CurrentUser, options => + { + options.OnAuthenticateAsClient = (connection, sslOptions) => + { + sslOptions.TargetHost = "my-certificate-subject"; + }; + }); + }) + .ConfigureLogging(logging => logging.AddConsole()) + .Build(); + + await host.RunAsync(); + // + } +} + +class DevelopmentExample +{ + public static async Task ConfigureDevelopmentTls() + { + // + var hostBuilder = Host.CreateDefaultBuilder() + .UseEnvironment(Environments.Development); + + using IHost host = hostBuilder + .UseOrleans((context, builder) => + { + var isDevelopment = context.HostingEnvironment.IsDevelopment(); + + builder + .UseLocalhostClustering() + .UseTls(StoreName.My, "localhost", allowInvalid: isDevelopment, StoreLocation.CurrentUser, options => + { + options.OnAuthenticateAsClient = (connection, sslOptions) => + { + sslOptions.TargetHost = "localhost"; + }; + + if (isDevelopment) + { + options.AllowAnyRemoteCertificate(); + } + }); + }) + .ConfigureLogging(logging => logging.AddConsole()) + .Build(); + + await host.RunAsync(); + // + } +} + +class CertificateExample +{ + public static async Task ConfigureTlsWithCertificate() + { + // + using var cert = X509CertificateLoader.LoadPkcs12FromFile("path/to/certificate.pfx", "password"); + + using IHost host = Host.CreateDefaultBuilder() + .UseOrleans(builder => + { + builder + .UseLocalhostClustering() + .UseTls(cert, options => + { + options.OnAuthenticateAsClient = (connection, sslOptions) => + { + sslOptions.TargetHost = cert.GetNameInfo(X509NameType.DnsName, false) ?? "my-certificate-subject"; + }; + }); + }) + .ConfigureLogging(logging => logging.AddConsole()) + .Build(); + + await host.RunAsync(); + // + } +} + +class AdvancedExample +{ + public static async Task ConfigureAdvancedTls() + { + // + using IHost host = Host.CreateDefaultBuilder() + .UseOrleans(builder => + { + builder + .UseLocalhostClustering() + .UseTls(StoreName.My, "my-certificate-subject", allowInvalid: false, StoreLocation.LocalMachine, options => + { + options.LocalServerCertificateSelector = (connection, serverName) => + { + using var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); + store.Open(OpenFlags.ReadOnly); + + var certificates = store.Certificates.Find( + X509FindType.FindBySubjectName, + serverName ?? "my-certificate-subject", + validOnly: true); + + return certificates.Count > 0 ? certificates[0] : null; + }; + + options.RemoteCertificateValidation = (certificate, chain, sslPolicyErrors) => + sslPolicyErrors == SslPolicyErrors.None; + + options.OnAuthenticateAsClient = (connection, sslOptions) => + { + sslOptions.TargetHost = "my-certificate-subject"; + }; + + options.CheckCertificateRevocation = true; + }); + }) + .ConfigureLogging(logging => logging.AddConsole()) + .Build(); + + await host.RunAsync(); + // + } +} + +static class SampleCertificates +{ + public static X509Certificate2 CreateDevelopmentCertificate(string dnsName) + { + using var rsa = RSA.Create(2048); + + var request = new CertificateRequest( + $"CN={dnsName}", + rsa, + HashAlgorithmName.SHA256, + RSASignaturePadding.Pkcs1); + + request.CertificateExtensions.Add(new X509BasicConstraintsExtension(false, false, 0, false)); + request.CertificateExtensions.Add(new X509KeyUsageExtension( + X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.KeyEncipherment, + critical: true)); + request.CertificateExtensions.Add(new X509SubjectKeyIdentifierExtension(request.PublicKey, false)); + + var subjectAlternativeNames = new SubjectAlternativeNameBuilder(); + subjectAlternativeNames.AddDnsName(dnsName); + request.CertificateExtensions.Add(subjectAlternativeNames.Build()); + + var usages = new OidCollection + { + new("1.3.6.1.5.5.7.3.1"), + new("1.3.6.1.5.5.7.3.2"), + }; + request.CertificateExtensions.Add(new X509EnhancedKeyUsageExtension(usages, critical: true)); + + using var created = request.CreateSelfSigned( + DateTimeOffset.UtcNow.AddDays(-1), + DateTimeOffset.UtcNow.AddDays(30)); + + var password = Guid.NewGuid().ToString("N"); + // Windows server-side TLS requires a key container instead of an ephemeral key. + return X509CertificateLoader.LoadPkcs12( + created.Export(X509ContentType.Pfx, password), + password, + X509KeyStorageFlags.Exportable | X509KeyStorageFlags.UserKeySet, + Pkcs12LoaderLimits.Defaults); + } +} diff --git a/docs/orleans/host/snippets/transport-layer-security/csharp/SiloExample/SiloExample.csproj b/docs/orleans/host/snippets/transport-layer-security/csharp/SiloExample/SiloExample.csproj new file mode 100644 index 0000000000000..752ae4c54c8aa --- /dev/null +++ b/docs/orleans/host/snippets/transport-layer-security/csharp/SiloExample/SiloExample.csproj @@ -0,0 +1,15 @@ + + + + Exe + net10.0 + enable + enable + + + + + + + + diff --git a/docs/orleans/host/transport-layer-security.md b/docs/orleans/host/transport-layer-security.md new file mode 100644 index 0000000000000..47ed8f8c2f616 --- /dev/null +++ b/docs/orleans/host/transport-layer-security.md @@ -0,0 +1,129 @@ +--- +title: Orleans Transport Layer Security (TLS) +description: Learn how to configure Transport Layer Security (TLS) and mutual TLS (mTLS) in .NET Orleans to secure network communication between hosts. +ms.date: 03/11/2026 +ms.topic: how-to +ai-usage: ai-assisted +--- + +# Orleans Transport Layer Security (TLS) + +Transport Layer Security (TLS) is a cryptographic protocol that secures network communication between Orleans silos and clients. Configure TLS to implement mutual authentication (mTLS) and encrypt data in transit, protecting your Orleans deployment from unauthorized access and eavesdropping. + +## Prerequisites + +Before configuring TLS, ensure you have: + +- An Orleans application with the [Microsoft.Orleans.Server](https://www.nuget.org/packages/Microsoft.Orleans.Server) NuGet package installed for silos. +- The [Microsoft.Orleans.Client](https://www.nuget.org/packages/Microsoft.Orleans.Client) NuGet package installed for clients. +- The [Microsoft.Orleans.Connections.Security](https://www.nuget.org/packages/Microsoft.Orleans.Connections.Security) NuGet package installed for both silos and clients. +- A valid X.509 certificate for authentication, either in the Windows certificate store or as a file. + +> [!TIP] +> The accompanying `SiloExample` and `ClientExample` projects include a development-only startup path that creates temporary self-signed certificates so you can run the sample locally. The inline snippets below focus on the certificate store and certificate file patterns you would typically adapt for your own deployments. + +## Configure TLS on silos + +To enable TLS on an Orleans silo, use the extension method. This method provides several overloads for different certificate configuration scenarios. + +### Basic TLS configuration + +The following example shows how to configure TLS using a certificate from the Windows certificate store: + +:::code language="csharp" source="./snippets/transport-layer-security/csharp/SiloExample/Program.cs" id="BasicTlsConfiguration"::: + +In the preceding code: + +- The `StoreName.My` parameter specifies the certificate store location (Personal certificates). +- The `"my-certificate-subject"` parameter identifies the certificate by its subject name. +- The `allowInvalid: false` parameter ensures that only valid certificates are accepted in production. +- The `StoreLocation.CurrentUser` parameter specifies the certificate store scope. +- The `OnAuthenticateAsClient` callback sets the `TargetHost` for outbound connections initiated by the silo. + +### Development environment configuration + +For development and testing, you might need to use self-signed certificates. The following example shows how to configure TLS with relaxed validation for development: + +:::code language="csharp" source="./snippets/transport-layer-security/csharp/SiloExample/Program.cs" id="DevelopmentTlsConfiguration"::: + +In the preceding code: + +- The `context.HostingEnvironment.IsDevelopment()` method checks if the application is running in a development environment. +- The method disables certificate validation in development. + +> [!WARNING] +> Never use `AllowAnyRemoteCertificate()` or `allowInvalid: true` in production deployments. These settings disable important security checks and expose your application to security vulnerabilities. + +### Certificate file configuration + +If you have a certificate file instead of using the certificate store, configure TLS as shown in the following example: + +:::code language="csharp" source="./snippets/transport-layer-security/csharp/SiloExample/Program.cs" id="CertificateTlsConfiguration"::: + +In the preceding code: + +- The method loads a certificate from a PKCS#12 file (PFX format). +- The certificate is passed directly to the `UseTls` method. + +### Advanced TLS configuration + +For production deployments, you might need more control over certificate selection and validation. The following example demonstrates advanced TLS configuration: + +:::code language="csharp" source="./snippets/transport-layer-security/csharp/SiloExample/Program.cs" id="AdvancedTlsConfiguration"::: + +In the preceding code: + +- The callback dynamically selects the appropriate server certificate. +- The callback provides custom validation logic for remote certificates. +- The property enables certificate revocation checking. + +## Configure TLS on clients + +Orleans clients require similar TLS configuration to securely connect to TLS-enabled silos. + +### Basic client TLS configuration + +The following example shows how to configure TLS on an Orleans client: + +:::code language="csharp" source="./snippets/transport-layer-security/csharp/ClientExample/Program.cs" id="BasicClientTlsConfiguration"::: + +In the preceding code: + +- The extension method configures TLS for the client. +- The callback configures client-side TLS options and sets the `TargetHost` to match the server certificate name. +- When you call `UseTls` with a client certificate, the client sends that certificate during the TLS handshake so the silo can enforce mutual TLS. + +### Development client configuration + +For development environments, configure the client with relaxed validation as shown in the following example: + +:::code language="csharp" source="./snippets/transport-layer-security/csharp/ClientExample/Program.cs" id="ClientDevelopmentTlsConfiguration"::: + +### Certificate file client configuration + +Configure a client using a certificate file as shown in the following example: + +:::code language="csharp" source="./snippets/transport-layer-security/csharp/ClientExample/Program.cs" id="ClientCertificateTlsConfiguration"::: + +## Best practices + +Follow these best practices when configuring TLS in Orleans: + +- **Use the latest TLS protocol**: Always prefer TLS 1.2 or TLS 1.3 for the strongest security. Avoid TLS 1.0 and TLS 1.1, which have known vulnerabilities. +- **Let the OS choose the protocol version**: Don't explicitly set TLS protocol versions in production code. Instead, defer to operating system defaults to automatically select the best protocol. Only explicitly set protocol versions if you have a specific compatibility requirement with legacy systems. When you explicitly set protocol versions, your application can't automatically benefit from newer protocols added in future OS updates. +- **Validate certificates**: Always validate certificate chains, expiration dates, and hostname matches in production. Never use `AllowAnyRemoteCertificate()` or disable certificate validation outside of development environments. +- **Enable certificate revocation checking**: Use to verify that certificates haven't been revoked. +- **Use strong certificates**: Ensure your X.509 certificates use strong key lengths (at least 2048 bits for RSA) and are signed by a trusted Certificate Authority (CA). +- **Secure certificate storage**: Protect private keys with appropriate file permissions or by using hardware security modules (HSMs). +- **Keep certificates current**: Monitor certificate expiration dates and renew certificates before they expire. +- **Keep software updated**: Regularly update your .NET runtime and operating system to receive the latest security patches and protocol support. + +For more information on .NET TLS best practices, see [TLS/SSL best practices](../../core/extensions/sslstream-best-practices.md). + +## See also + +- [Client configuration](configuration-guide/client-configuration.md) +- [Server configuration](configuration-guide/server-configuration.md) +- +- +- [Orleans Transport Layer Security (TLS) sample](/samples/dotnet/samples/orleans-transport-layer-security-tls/) diff --git a/docs/orleans/toc.yml b/docs/orleans/toc.yml index e67a12c197e22..011359b045e45 100644 --- a/docs/orleans/toc.yml +++ b/docs/orleans/toc.yml @@ -130,6 +130,8 @@ items: href: host/heterogeneous-silos.md - name: Grain directory href: host/grain-directory.md + - name: Transport Layer Security (TLS) + href: host/transport-layer-security.md - name: Configuration guide items: - name: Overview diff --git a/docs/standard/attributes/retrieving-information-stored-in-attributes.md b/docs/standard/attributes/retrieving-information-stored-in-attributes.md index aaf3ad3038bc2..b80f885b32e2d 100644 --- a/docs/standard/attributes/retrieving-information-stored-in-attributes.md +++ b/docs/standard/attributes/retrieving-information-stored-in-attributes.md @@ -56,7 +56,7 @@ The attribute was not found. ## Retrieving Multiple Instances of an Attribute Applied to the Same Scope - In the preceding example, the class to inspect and the specific attribute to find are passed to the method. That code works well if only one instance of an attribute is applied on the class level. However, if multiple instances of an attribute are applied on the same class level, the `GetCustomAttribute` method doesn't retrieve all the information. In cases where multiple instances of the same attribute are applied to the same scope, you can use method to place all instances of an attribute into an array. For example, if two instances of `DeveloperAttribute` are applied on the class level of the same class, the `GetAttribute` method can be modified to display the information found in both attributes. Remember, to apply multiple attributes on the same level. The attribute must be defined with the `AllowMultiple` property set to `true` in the class. +In the preceding example, the class to inspect and the specific attribute to find are passed to the method. That code works well if only one instance of an attribute is applied on the class level. However, if multiple instances of an attribute are applied on the same class level, the `GetCustomAttribute` method doesn't retrieve all the information. In cases where multiple instances of the same attribute are applied to the same scope, you can use method to place all instances of an attribute into an array. For example, if two instances of `DeveloperAttribute` are applied on the class level of the same class, the `GetAttribute` method can be modified to display the information found in both attributes. To apply multiple attributes on the same level, the attribute must be defined with the `AllowMultiple` property set to `true` in the class. The following code example shows how to use the `GetCustomAttributes` method to create an array that references all instances of `DeveloperAttribute` in any given class. The code then outputs the values of all the attributes to the console. diff --git a/docs/visual-basic/programming-guide/language-features/objects-and-classes/inheritance-basics.md b/docs/visual-basic/programming-guide/language-features/objects-and-classes/inheritance-basics.md index f327c72743ad9..e5e9d342c19ee 100644 --- a/docs/visual-basic/programming-guide/language-features/objects-and-classes/inheritance-basics.md +++ b/docs/visual-basic/programming-guide/language-features/objects-and-classes/inheritance-basics.md @@ -1,7 +1,8 @@ --- title: "Inheritance Basics" description: "Learn more about: Inheritance Basics (Visual Basic)" -ms.date: 07/20/2015 +ms.date: 03/11/2026 +ai-usage: ai-assisted helpviewer_keywords: - "derived classes [Visual Basic], inheritance" - "MyClass keyword [Visual Basic], using" @@ -145,3 +146,11 @@ Even though `derivedClass` overrides `testMethod`, the `MyClass` keyword in `use - [Inherits Statement](../../../language-reference/statements/inherits-statement.md) - [Me, My, MyBase, and MyClass](../../program-structure/me-my-mybase-and-myclass.md) +- [Object-Oriented Programming (Visual Basic)](../../concepts/object-oriented-programming.md) +- [Interfaces (Visual Basic)](../interfaces/index.md) +- [Differences between shadowing and overriding](../declared-elements/differences-between-shadowing-and-overriding.md) +- [Generic Types in Visual Basic](../data-types/generic-types.md) +- [Covariance and Contravariance (Visual Basic)](../../concepts/covariance-contravariance/index.md) +- [Variance in Generic Interfaces (Visual Basic)](../../concepts/covariance-contravariance/variance-in-generic-interfaces.md) +- [Abstract class design](../../../../standard/design-guidelines/abstract-class.md) +- [Base Classes for Implementing Abstractions](../../../../standard/design-guidelines/base-classes-for-implementing-abstractions.md)