使用Javascript WinRT将标题添加到PlayReadyLicenseAquisitionServiceRequest

使用Javascript WinRT将标题添加到PlayReadyLicenseAquisitionServiceRequest,javascript,uwp,windows-runtime,Javascript,Uwp,Windows Runtime,我在想如何做一些我认为很简单的事情时遇到了不少麻烦。在初始化视频流之前,DRM服务器为我们的应用程序提供一个令牌,以便在授权标头中使用。在我们的代码中,我们使用的MediaProtectionManager是PlayReady的一部分。当需要许可证调用时,管理器通过回调函数发送请求。据推测,我应该能够在等待结果之前向该请求添加一个头,但我没有看到任何方法。请求的类型为PlayReadyLicenseAquisitionServiceRequest const setupDRM = (onServ

我在想如何做一些我认为很简单的事情时遇到了不少麻烦。在初始化视频流之前,DRM服务器为我们的应用程序提供一个令牌,以便在授权标头中使用。在我们的代码中,我们使用的MediaProtectionManager是PlayReady的一部分。当需要许可证调用时,管理器通过回调函数发送请求。据推测,我应该能够在等待结果之前向该请求添加一个头,但我没有看到任何方法。请求的类型为PlayReadyLicenseAquisitionServiceRequest

const setupDRM = (onServiceRequested) => {
  const { MediaProtectionManager } = window.Windows.Media.Protection;
  const manager = new MediaProtectionManager();
  // other setup steps excluded for readability...
  manager.addEventListener('servicerequested', onServiceRequested, false);
};


const onServiceRequested = async (event) => {
  const { request } = event;
  appendToken(request); // Add authorization header with token
  const result = await request.beginServiceRequest();
};

const appendToken = (request) => {
   // How do I do this?
}
现在,我发现类似的问题得到了回答,但仅限于C。在所有这些情况下,答案都是将请求克隆为HTTP请求,添加头并等待结果

public static async Task<bool> RequestLicenseManual(PlayReadyLicenseAcquisitionServiceRequest request, params KeyValuePair<string, object>[] headers)
{
  Debug.WriteLine("ProtectionManager PlayReady Manual License Request in progress");

  try
  {
    var r = request.GenerateManualEnablingChallenge();

    var content = new ByteArrayContent(r.GetMessageBody());

    foreach (var header in r.MessageHeaders.Where(x => x.Value != null))
    {
      if (header.Key.Equals("Content-Type", StringComparison.OrdinalIgnoreCase))
      {
        content.Headers.ContentType = MediaTypeHeaderValue.Parse(header.Value.ToString());
      }
      else
      {
        content.Headers.Add(header.Key, header.Value.ToString());
      }
    }

    var msg = new HttpRequestMessage(HttpMethod.Post, r.Uri) { Content = content };

    foreach (var header in headers)
    {
      msg.Headers.Add(header.Key, header.Value.ToString());
    }

    Debug.WriteLine("Requesting license from {0} with custom data {1}", msg.RequestUri, await msg.Content.ReadAsStringAsync());

    var client = new HttpClient();
    var response = await client.SendAsync(msg);

    if (response.IsSuccessStatusCode)
    {
      request.ProcessManualEnablingResponse(await response.Content.ReadAsByteArrayAsync());
    }
    else
    {
      Debug.WriteLine("ProtectionManager PlayReady License Request failed: " + await response.Content.ReadAsStringAsync());

      return false;
    }
  }
  catch (Exception ex)
  {
    Debug.WriteLine("ProtectionManager PlayReady License Request failed: " + ex.Message);

    return false;
  }

  Debug.WriteLine("ProtectionManager PlayReady License Request successfull");

  return true;
}
公共静态异步任务请求许可手册(PlayReadyLicenseAquisitionServiceRequest请求,参数KeyValuePair[]头)
{
Debug.WriteLine(“ProtectionManager PlayReady手动许可证请求正在进行”);
尝试
{
var r=request.generateManualEnableNablingChallenge();
var content=newbytearraycontent(r.GetMessageBody());
foreach(r.MessageHeaders.Where中的var头(x=>x.Value!=null))
{
if(header.Key.Equals(“内容类型”,StringComparison.OrdinalIgnoreCase))
{
content.Headers.ContentType=MediaTypeHeaderValue.Parse(header.Value.ToString());
}
其他的
{
content.Headers.Add(header.Key,header.Value.ToString());
}
}
var msg=newhttprequestmessage(HttpMethod.Post,r.Uri){Content=Content};
foreach(标头中的var标头)
{
msg.Headers.Add(header.Key,header.Value.ToString());
}
Debug.WriteLine(“使用自定义数据{1}从{0}请求许可证”,msg.RequestUri,wait msg.Content.ReadAsStringAsync());
var client=新的HttpClient();
var response=wait client.sendaync(msg);
if(响应。IsSuccessStatusCode)
{
request.ProcessManualEnablingResponse(wait response.Content.ReadAsByteArrayAsync());
}
其他的
{
Debug.WriteLine(“ProtectionManager PlayReady许可证请求失败:“+Wait response.Content.ReadAsStringAsync());
返回false;
}
}
捕获(例外情况除外)
{
Debug.WriteLine(“ProtectionManager PlayReady许可证请求失败:“+ex.Message”);
返回false;
}
Debug.WriteLine(“ProtectionManager PlayReady许可证请求成功”);
返回true;
}

我已经能够在JavaScript中重现这一点,但似乎找不到一种方法将getMessageBody返回的字节数组转换为任何可用的内容,并且在WinRt API中找不到与ByteArrayContent等效的内容。在任何情况下,这一切似乎都是矫枉过正。这难道不应该像对请求调用set header函数一样简单吗?

我遇到了完全相同的问题。你找到解决办法了吗?等等。我已经将C#代码转换为Javascript和Typescript,但主要的症结在于HttpBufferContent和ByteArrayContent之间似乎存在差异。Js可以使用前者,但只要从主体内容中读取缓冲区,我得到的都是内容头,soap请求主体就会被删除。WinRt端可用的HttpClient的工作方式似乎也不同,并且与C#位于不同的命名空间中,这导致难以设置正确的身份验证头。谢谢回复。从我开始这个问题到现在为止,我只听说过蟋蟀。仅供参考,C代码工作得非常完美,但我几乎是我团队中唯一理解C的开发人员,因此我们的愿望是,无论我们做什么,为了将来的可维护性,我们都使用JavaScript。否则,我就用C#了结了!嘿不确定它是否有用,但我认为我已经解决了将ByteArrayContent转换为适合WinRt方法的格式的问题(iBuffer)。我仍然无法在XBox One上成功播放(这可能是由于标题)
var r=request.GenerateManualEnableNablingChallenge();var byteArray=r.getMessageBody();var dataWriter=new Windows.Storage.Streams.dataWriter();dataWriter.writeBytes(byteArray);var iBuffer=dataWriter.detachBuffer();var content=new Windows.Web.Http.HttpBufferContent(iBuffer)我还没有尝试DataWriter,但我确实让C端与JS端协同工作,并转换为number[]。请求是否成功通过似乎并不重要。在JS或C#端使用请求处理结果,在调用ProcessManuallyEnableingResponse时,无论是在任何一端,它都会被忽略。问题是视频元素绑定到JS端的DRM管理器。在JS中调用此方法没有任何意义,因为它表示成功,但实际上什么都不做。