Проблемы потоковой передачи HTTP с WP7 (Windows Phone 7) и Fiddler - PullRequest
0 голосов
/ 10 июля 2010

У меня очень специфическая проблема с программой, которую я разрабатываю для WP7.Прежде всего, я разрабатываю приложение потоковых цитат, которое использует HttpWebRequest / Response асинхронно.Я также отслеживаю все это в Fiddler, чтобы убедиться, что все правильно.

Цитаты поступают через всегда открытое соединение Http с сервером.Вход в систему работает нормально, а также отправка запроса подписки цитаты.Проблема заключается в том, что я никогда не получаю ответ обратно (он никогда не попадает в EndGetResponse), если я не делаю одну из двух вещей:

1- Повторный запрос на открытую подписку через Fiddler 2 - Отправьте идентичный запрос через RequestBuilder Fiddler

Я пытался запустить это приложение на симуляторе на моем ноутбуке, но приложение не работало, я получил исключение протокола, но это вопрос для другой темы.

Есть идеи?Я думаю, что это связано с потоковой передачей данных через Fiddler.Я попытался удалить Fiddler, отключить захват, отменить настройку прокси в WinInet, но ничего не помогло.Это сводит меня с ума, поэтому ваша помощь будет принята с благодарностью.

Обновление: мне удалось воссоздать это с помощью потокового API Twitter.Ниже новый код.Просто измените местозаполнитель учетных данных следующим образом:

MainPage.xaml:

<phoneNavigation:PhoneApplicationPage 
    x:Class="TestHttpStreaming.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Navigation"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}">

    <Grid x:Name="LayoutRoot" Background="{StaticResource PhoneBackgroundBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitleGrid is the name of the application and page title-->
        <Grid x:Name="TitleGrid" Grid.Row="0">
            <TextBlock Text="MY APPLICATION" x:Name="textBlockPageTitle" Style="{StaticResource PhoneTextPageTitle1Style}"/>
            <TextBlock Text="page title" x:Name="textBlockListTitle" Style="{StaticResource PhoneTextPageTitle2Style}"/>
        </Grid>

        <!--ContentGrid is empty. Place new content here-->
        <Grid x:Name="ContentGrid" Grid.Row="1">
            <Button Content="Test" Height="70" HorizontalAlignment="Left" Margin="163,149,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click" />
        </Grid>
    </Grid>

</phoneNavigation:PhoneApplicationPage>

MainPage.xaml.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.IO;

namespace TestHttpStreaming
{
    public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();

            SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;
        }

        Uri uri = null;
        HttpWebRequest request = null;
        byte[] buffer = new byte[1024];
        Stream stream = null;
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            uri = new Uri("http://stream.twitter.com/1/statuses/sample.json?delimited=length", UriKind.Absolute);
            request = (HttpWebRequest)WebRequest.Create(uri);
            request.Method = "GET";
            request.Credentials = new NetworkCredential("[username]", "[password]");
            request.BeginGetResponse(new AsyncCallback(this.EndGetResponseStream), null);
        }
        void EndGetResponseStream(IAsyncResult result)
        {
            try
            {
                HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
                stream = response.GetResponseStream();
                IAsyncResult iarRead = stream.BeginRead(buffer, 0, 1024, new AsyncCallback(StreamingReadCallBack), null);
            }
            finally
            {
            }
        }
        private void StreamingReadCallBack(IAsyncResult asyncResult)
        {
            int read = stream.EndRead(asyncResult);
        }
    }
}

Ответы [ 3 ]

1 голос
/ 09 января 2011

Не уверен, что кто-то еще сталкивается с этой проблемой. У меня была эта проблема, и я исправил ее, установив:

request.AllowReadStreamBuffering = false;

Это с последней платформой.

0 голосов
/ 10 июля 2010
0 голосов
/ 10 июля 2010

Пожалуйста, проверьте, чтобы увидеть:

  1. Вы включили режим потоковой передачи в строке меню полосы инструментов?

    2.Вы выключили «Включить автоматические ответы»?

Надеюсь, эта помощь.

...