Используя собственное расширение обмена сообщениями для Edge, можно ли отправить более одного ответа на один запрос? Помимо других функций, мое расширение предназначено для поддержки загрузки файлов, но мне нужно иметь дело с собственным ограничением размера сообщения. В связи с этим я хотел бы отправить данные файла, разделенные на несколько фрагментов:
private async void OnAppServiceRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
AppServiceDeferral messageDeferral = args.GetDeferral();
try
{
this.currentConnectionIndex = Int32.Parse(sender.AppServiceName);
this.desktopBridgeConnection = desktopBridgeConnections[this.currentConnectionIndex];
// Send message to the desktopBridge component and wait for response
AppServiceResponse desktopBridgeResponse = await this.desktopBridgeConnection.SendMessageAsync(args.Request.Message);
// Response Message is a ValueSet with all parts of processed file
foreach (KeyValuePair<String, Object> chunk in desktopBridgeResponse.Message)
{
ValueSet vs = new ValueSet();
vs.Add(chunk.Key, chunk.Value);
await args.Request.SendResponseAsync(vs);
}
}
catch(Exception ex)
{
//The InvalidOperationException is thrown after second SendResponseAsync call
Utils.Log(ex.ToString());
}
finally
{
messageDeferral.Complete();
}
}
Часть расширения javascript готова для этого, так как мы успешно используем ее в Firefox и Chrome — она знает, когда она получает одно сообщение или фрагмент (на основе заголовка данных). Но проблема в том, что всякий раз, когда я вызываю AppServiceRequest.SendResponseAsync()
, порт закрывается (автоматически?) после отправки ответа. Он должен быть закрыт какой-то частью приложения UWP, поскольку закрытие порта частью JS регистрируется, а в консоли Edge такой записи нет. Попытка отправить другой фрагмент приводит к
System.InvalidOperationException: метод был вызван в неожиданное исключение времени
быть брошенным.
Я столкнулся с похожим вопросом здесь на SO, где в ответе предлагается проверить работу с отсрочками, но после нескольких правок кода мне это кажется правильным (мой проект основан на образце MSFT).
Я также пытался установить "background": { persistent: true }
в manifest.json
, но, похоже, это не влияет на это.
Есть ли что-то еще, что я должен проверить/установить? Или это поведение не поддерживается?