从C#Vxml浏览器访问Cookie

时间:2011-10-04 01:33:11

标签: c# cookies ucma vxml

C#中的Microsoft.Rtc.Collaboration.AudioVideo.VoiceXml.Browser对象有一个运行Vxml页面的URI的RunAsync方法和一个理论上允许传入可以参数的CookieCollection在脚本中使用。我已经尝试了所有可以想到的从Vxml中获取cookie的方法,并且似乎没有附加到文档中。关于如何从Vxml访问传入的cookie的任何想法?

简单来说,这就是我所拥有的vxml:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE vxml PUBLIC "-//BeVocal Inc//VoiceXML 2.0//EN" "http://cafe.bevocal.com/libraries/dtd/vxml2-0-bevocal.dtd">
<vxml version="2.1" xmlns="http://www.w3.org/2001/vxml" xml:lang="en-US" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/vxml http://www.w3.org/TR/voicexml21/vxml.xsd" >
  <form id="QueueForm">
  <script> 
   <![CDATA[
      function GetCookie(name)
      {         
         var cookies = document.cookie;
         return cookies;
      }
   ]]>
  </script>
  <var name="cookie" expr="GetCookie('')" />
    <field name="QueueField">
      <prompt>
        <value expr="cookie" />
        were cookies
      </prompt>
      <grammar mode="dtmf" root="Dtmf">
        <rule id="Dtmf">
          <one-of>
            <item> 1 </item>
          </one-of>
        </rule>
      </grammar>
      <filled>
        <exit namelist="cookie"/>
      </filled>
    </field>
  </form>
</vxml>

这在调用代码中

_browser.SetAudioVideoCall(_call);
System.Net.CookieContainer cookies = new System.Net.CookieContainer(1);
cookies.Add(new System.Net.Cookie("data", "grapefruit", "/", "localhost"));
_browser.Run(_startPage, cookies);

...导致口语“是饼干”。在所有情况下我都试过了。

我已经尝试在cookie对象上设置不同的域和路径,调用不同的Javascript对象以获得cookie不同的方式以及我能想到的任何其他内容,但无法访问cookie。 Vxml的Microsoft示例项目也不包含访问cookie的示例。我确信有办法访问传入的项目,但我无法弄清楚如何;有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我是UCMA 3.0附带的VoiceXML浏览器API的PM。我抨击了一位致力于实施它的开发人员,并让她调查这个问题。这是她的回应。

VXML浏览器允许您使用Run()和RunAsync()方法将CookieContainer发送到浏览器中。在运行过程中,浏览器将向服务器发出http请求以获取vxml内容。此cookie容器作为http请求的一部分发送,服务器发送的任何cookie也最终都在此容器中。这是每个设计。

这使您可以根据发送的cookie编写可能提供不同vxml的动态服务器。您还可以在会话完成后查看服务器cookie值。例如,黄金客户帐户可能是一个特殊的对话框,服务器可能会向您发送cookie,帮助您确定在浏览器完成后将呼叫发送到哪个队列。

但是,cookie不会传递到vxml应用程序本身 - 也就是说,它们无法在vxml文档内的javascript级别访问。我同意这很方便,当然,工程师习惯于处理他们可以访问“document.cookie”的html浏览器可能会期待这一点。但是w3c vxml规范并未在此区域中调用标准行为,并且Microsoft浏览器不提供此功能。

如果需要这样的功能,一个工程解决方案是让您的服务器读取cookie并动态生成vxml,并将cookie值设置为某些javascript变量。