отправка AJAX-запроса на аудио-большой двоичный объект в асинхронный API

#javascript #c# #jquery #ajax #azure-cognitive-services

#javascript #c# #jquery #ajax #azure-cognitive-services

Вопрос:

Я работаю в устаревшей системе и пытаюсь вызвать HTTP-обработчик, в который я добавил некоторую логику, которая извлекает аудио-большой двоичный объект из службы Azure. Дело в том, что я, похоже, не могу вернуть содержимое клиенту, чтобы я мог его воспроизвести. Ответ, который я получаю от вызова jQuery, звучит так: «Система.Многопоточность.Задачи.Задача `1[Система.Строка]»

Это код ProcessRequest:

 public void ProcessRequest(HttpContext context)
    {
        var text = "walk";
        Authentication auth = new Authentication("subscriptionID");
        context.Response.Write(auth.getVoice(text));
    }
  

Вот функция getVoice:

  public async Task<string> getVoice(string text)
    {
        using (var client = new HttpClient())
        {
            try
            {
                client.DefaultRequestHeaders
                    .Add("User-Agent", "uagent");
                client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
                client.DefaultRequestHeaders.Add("Authorization", "Bearer "   this.token);
                client.DefaultRequestHeaders.Add("host", "westeurope.tts.speech.microsoft.com");
                client.DefaultRequestHeaders.Add("X-MICROSOFT-OutputFormat", "audio-16khz-32kbitrate-mono-mp3");
                UriBuilder uriBuilder = new UriBuilder(VoiceUri);
                // send xml post 
                var voiceTest = "<speak version='1.0' xml:lang='en-US'><voice xml:lang='en-US' xml:gender='Female'nrname='Microsoft Server Speech Text to Speech Voice (en-US, ZiraRUS)'>nrWalknr</voice></speak>";
                var data = new StringContent(voiceTest, Encoding.UTF8, "application/xml");
                data.Headers.ContentType = new MediaTypeHeaderValue("application/ssml xml");
                var result = await client.PostAsync(uriBuilder.Uri.AbsoluteUri, data);
                return await result.Content.ReadAsStringAsync();
            }
            catch (Exception e)
            {

                return null;
            }
        }
  

Вызов серверного API выполнен успешно, но, похоже, я не могу получить его на стороне клиента, чтобы впоследствии воспроизвести его пользователю.

Ответ №1:

Вы должны развернуть результат auth.getVoice . Вы можете сделать это, используя await ключевое слово. Также вам нужен обработчик для реализации HttpTaskAsyncHandler класса, чтобы заставить его работать

 public class TestHandler : HttpTaskAsyncHandler
{
    public async override Task ProcessRequestAsync(HttpContext context)
    {
        var text = "walk";
        Authentication auth = new Authentication("subscriptionID");
        context.Response.Write(await auth.getVoice(text)); //added await here
    }
//..
}
  

Комментарии:

1. Хорошо, изменение кода позволило мне получать данные blob-объекта, но я все еще не знаю, как их воспроизвести. Я пытаюсь использовать аудио-элемент, но пока безуспешно.