

的版本 4 (V4) 适用于 .NET 的 AWS SDK 已经发布！

有关重大更改和迁移应用程序的信息，请参阅[迁移主题](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)。

 [https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 对 HTTP 2 的支持 适用于 .NET 的 AWS SDK
<a name="http2-support"></a>

某些 AWS 服务和操作需要 HTTP 2。例如，无法通过 HTTP 1.1 在 Amazon Transcribe Streaming 中进行双向流式传输，因此需要改用 HTTP 2。版本 4 适用于 .NET 的 AWS SDK 增加了对 HTTP 2 的支持，因此您可以在应用程序中使用这些操作。对于双向 HTTP 2 操作，SDK 在接收直播时的行为与 HTTP 1.1 的行为类似。也就是说，当使用 SDK 的应用程序向服务发送事件时，该请求会有一个由开发者分配的发布者。

要了解这种行为的实际效果，请考虑以下 Amazon Transcribe Streaming 示例。它使用[亚马逊。 TranscribeStreaming](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/TranscribeStreaming/NTranscribeStreaming.html)还有[亚马逊。 TranscribeStreaming.模型](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/TranscribeStreaming/NTranscribeStreamingModel.html)命名空间。

在此示例中，开发人员使用回调函数（.NET）定义该`StartStreamTranscriptionRequest.AudioStreamPublisher`属性`Func`。SDK 使用`Func`定义的 f `AudioStreamPublisher` or 从用户的代码中提取事件以流式传输给用户。SDK 会调用，`Func`直到它返回空值。

该代码演示了如何将文件中的音频流式传输到 Amazon Transcribe Streaming 中进行处理。

```
using Amazon;
using Amazon.TranscribeStreaming;
using Amazon.TranscribeStreaming.Model;

CancellationTokenSource cancelSource = new CancellationTokenSource();

var client = new AmazonTranscribeStreamingClient(RegionEndpoint.USEast1);

var startRequest = new StartStreamTranscriptionRequest
{
    LanguageCode = LanguageCode.EnUS,
    MediaEncoding = MediaEncoding.Flac,
    MediaSampleRateHertz = 44100,
    NumberOfChannels = 2,
    EnableChannelIdentification = true
};

Stream fileStream = File.OpenRead("hello-world.flac");
var buffer = new byte[1024 * 10];
startRequest.AudioStreamPublisher += async () =>
{
    var bytesRead = await fileStream.ReadAsync(buffer, 0, buffer.Length);

    if (bytesRead == 0)
        return null;

    var audioEvent = new AudioEvent
    {
        AudioChunk = new MemoryStream(buffer, 0, bytesRead)
    };

    return audioEvent;
};

using var response = await client.StartStreamTranscriptionAsync(startRequest);
Console.WriteLine(response.HttpStatusCode);

response.TranscriptResultStream.ExceptionReceived += TranscriptResultStream_ExceptionReceived;
response.TranscriptResultStream.TranscriptEventReceived += TranscriptResultStream_TranscriptEventReceived;

void TranscriptResultStream_ExceptionReceived(object? sender, Amazon.Runtime.EventStreams.EventStreamExceptionReceivedArgs<TranscribeStreamingEventStreamException> e)
{
    Console.WriteLine(e.EventStreamException.Message);
    cancelSource.Cancel();
}
void TranscriptResultStream_TranscriptEventReceived(object? sender, Amazon.Runtime.EventStreams.EventStreamEventReceivedArgs<TranscriptEvent> e)
{
    foreach (var result in e.EventStreamEvent.Transcript.Results)
    {
        if (!string.Equals("ch_0", result.ChannelId, StringComparison.OrdinalIgnoreCase))
            continue;

        var text = result.Alternatives[0].Transcript;
        if (!string.IsNullOrEmpty(text))
        {
            Console.WriteLine(text);
        }
    }
}

_ = response.TranscriptResultStream.StartProcessingAsync();

try
{
    await Task.Delay(10000, cancelSource.Token);
}
catch (TaskCanceledException) { }
```

**警告**  
[一些双向 HTTP 2 操作，例如来自亚马逊 Bedrock `InvokeModelWithBidirectionalStreamAsync` 的方法，即亚马逊。 BedrockRuntime](https://docs.aws.amazon.com/sdkfornet/v4/apidocs/items/BedrockRuntime/NBedrockRuntime.html)命名空间，在某些事件发布之前，不要在服务客户端上返回初始调用的响应。此行为可能会导致您的应用程序被阻止。为避免这种情况，请将向发布者提供事件的应用程序代码分开，然后在与在服务客户端上调用操作的线程不同的线程上运行该代码。

## 额外注意事项
<a name="http2-support-additional"></a>
+ 适用于 .NET 的 AWS SDK 仅在以.NET 8 及更高版本为目标的版本中才支持 HTTP 2。它在以.NET 框架为目标的版本中不可用。
+ 有关更多详细信息，请参阅[aws-sdk-net](https://github.com/aws/aws-sdk-net) GitHub存储库中的 [PR 3730](https://github.com/aws/aws-sdk-net/pull/3730)。