【问题标题】:HttpWebRequest AllowReadStreamBuffering property not honored on cellular network?蜂窝网络上不支持 HttpWebRequest AllowReadStreamBuffering 属性?
【发布时间】:2012-05-10 15:27:55
【问题描述】:

我正在编写一个通过 http 使用持久连接的应用程序 - 也就是说,Web 服务器永远不会“完成”对响应流的写入,而客户端应用程序会在响应流进入时从响应流中读取数据。

我编写了一些 .NET 3.5 桌面/winforms 应用程序来确认服务器和客户端代码工作正常,然后编写了一个 windows phone 应用程序来做同样的事情。桌面/电话代码之间的唯一区别是我在电话上将 AllowReadStreamBuffering 属性设置为 false。

电话应用程序昨晚工作,但今天它不工作 - 尝试读取响应流时,它会挂起,直到从服务器端关闭连接 - 这意味着 HttpWebRequest 不支持 AllowReadStreamBuffering 设置。

昨晚和现在的区别在于,昨晚我使用的是 wifi,而今天我使用的是蜂窝网络。

我的假设是,在手机上,HttpWebRequest 仅在连接是 wifi(也可能是以太网)时尊重 AllowReadStreamBuffering = false,但在使用蜂窝网络时它会忽略它并缓冲。

那么当通过蜂窝连接时,HttpWebRequest 是否会强制读取流缓冲?我还没有找到任何证实这种行为的文档,所以我想知道是否有其他人经历过这种情况。稍后我将能够对此进行更彻底的测试,但现在我想我会问这个问题。

2012 年 5 月 11 日更新
测试并回答了我自己的问题(见下文)

【问题讨论】:

    标签: http windows-phone-7 persistent-connection


    【解决方案1】:

    AllowReadStreamBuffering = false 适用于蜂窝连接;否则(例如)音频流应用程序将无法正常运行。

    【讨论】:

    • 我的服务器每秒发送 1 个字节,在服务器关闭流之前,客户端不会通过蜂窝网络打开响应流。这是否意味着在 BeginGetResponse 触发之前可能存在最小数据接收大小?
    • 可能是服务器没有正确刷新,或者可能应该启用分块传输以获得更“正确”的长期连接支持。
    • 我将尝试对服务器端进行更改,但应用程序通过 wifi 而不是蜂窝网络运行这一事实让我认为这是一个 .NET 框架问题。
    【解决方案2】:

    我确认我的 WP7 应用程序最初在通过蜂窝连接时不会读取无缓冲的响应流 - 只有在以太网或 wifi 上时才会这样做。

    所以我修改了我的服务器 httphandler 以在连接开始时将初始数据块 (8k) 写入响应流。这样做会使应用程序立即在蜂窝网络上读取响应流,就像它在 wifi 上一样。忽略最初的数据爆炸后,应用程序可以很好地实时处理各个字节。

    我能想到的唯一结论是,当通过蜂窝连接时,HttpWebRequest 最初需要缓冲少量数据,然后才能无缓冲地读取流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      相关资源
      最近更新 更多