Исключение тайм-аута при вызове службы REST wp7 с использованием WebClient - PullRequest
4 голосов
/ 17 января 2012

Редактировать: Я хотел бы отдать награду за этот вопрос - время почти истекло - все комментарии ниже актуальны, но до сих пор нет решения.

Получение странной ошибки. Я сократил свой код до абсолютной простейшей формы и все еще получаю ошибку для следующего кода.

    public partial class MainPage : PhoneApplicationPage {
    private readonly WebClient webClient;

    public MainPage() {
        InitializeComponent();

        webClient = new WebClient();
        webClient.OpenReadCompleted += clientOpenRead_Completed;
    }

    private void LoadButton_Click(object sender, RoutedEventArgs e) {
        webClient.OpenReadAsync(new Uri(@"validURL"));
    }

    private void clientOpenRead_Completed(object sender, System.Net.OpenReadCompletedEventArgs e) {
        using (var sr = new StreamReader(e.Result)) {
            Result.Text = sr.ReadToEnd();
        }
    }  
}

sr.ReadToEnd (); всегда возвращает пустую строку, и когда я проверяю 'e.Result' из clientOpenRead_Completed, он содержит следующее исключение:

base    {"Timeouts are not supported on this stream."}  System.SystemException {System.InvalidOperationException}

Другие важные проверки: validURL работает по запросу из браузера. Кроме того, приведенный выше код прекрасно работает при вызове в консольном приложении, также тот же URL и аналогичный код прекрасно работают в Monodroid.

Наконец, источник службы не WCF.

Есть идеи?

Спасибо.

РЕДАКТИРОВАТЬ: трассировка стека в точке, которую я проверяю e.Result: (из немного другого проекта, но с той же проблемой)

>   AppTest.dll!AppTest.Data.AsyncServiceProvider.clientOpenRead_Completed(object sender, System.Net.OpenReadCompletedEventArgs e) Line 20  C#
System.Net.dll!System.Net.WebClient.OnOpenReadCompleted(System.Net.OpenReadCompletedEventArgs e) + 0x15 bytes   
System.Net.dll!System.Net.WebClient.OpenReadOperationCompleted(object arg) + 0xc bytes  
mscorlib.dll!System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo rtmi, object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object parameters, System.Globalization.CultureInfo culture, bool isBinderDefault, System.Reflection.Assembly caller, bool verifyAccess, ref System.Threading.StackCrawlMark stackMark)   
mscorlib.dll!System.Reflection.RuntimeMethodInfo.InternalInvoke(object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] parameters, System.Globalization.CultureInfo culture, ref System.Threading.StackCrawlMark stackMark) + 0x168 bytes 
mscorlib.dll!System.Reflection.MethodBase.Invoke(object obj, object[] parameters) + 0xa bytes   
mscorlib.dll!System.Delegate.DynamicInvokeOne(object[] args) + 0x98 bytes   
mscorlib.dll!System.MulticastDelegate.DynamicInvokeImpl(object[] args) + 0x8 bytes  
mscorlib.dll!System.Delegate.DynamicInvoke(object[] args) + 0x2 bytes   
System.Windows.dll!System.Windows.Threading.DispatcherOperation.Invoke() + 0xc bytes    
System.Windows.dll!System.Windows.Threading.Dispatcher.Dispatch(System.Windows.Threading.DispatcherPriority priority) + 0x83 bytes  
System.Windows.dll!System.Windows.Threading.Dispatcher.OnInvoke(object context) + 0x8 bytes 
System.Windows.dll!System.Windows.Hosting.CallbackCookie.Invoke(object[] args) + 0x19 bytes 
System.Windows.dll!System.Windows.Hosting.DelegateWrapper.InternalInvoke(object[] args) + 0x2 bytes 
System.Windows.RuntimeHost.dll!System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(System.IntPtr pHandle, int nParamCount, System.Windows.Hosting.NativeMethods.ScriptParam[] pParams, ref System.Windows.Hosting.NativeMethods.ScriptParam pResult) + 0x5e bytes 
[External Code] 

Ответы [ 4 ]

2 голосов
/ 17 января 2012

Может быть попробовать: webClient.DownloadStringAsync (yourUrl);

вместо

webClient.OpenReadAsync (yourUrl);

1 голос
/ 24 января 2012

Вы пытались сделать то же самое с HttpWebRequest с разными ContentType и Accept заголовками?

HttpWebRequest httpWebRequest = HttpWebRequest.CreateHttp(@"validURL");
httpWebRequest.Method = "GET";
httpWebRequest.BeginGetResponse((asyncresult) =>
{
    try
    {
        WebResponse webResponse = httpWebRequest.EndGetResponse(asyncresult);
        using (Stream stream = webResponse.GetResponseStream())
        {
            StreamReader Reader = new StreamReader(stream);
            string response = Reader.ReadToEnd();
        }
    }
    catch (Exception ex)
    {
        exception(ex);
    }
}, httpWebRequest);
1 голос
/ 17 января 2012

Попробуйте установить AllowReadStreamBuffering из webClient в false перед вызовом OpenReadAsync().

ОБНОВЛЕНИЕ

Исходя из вашего комментария, я думаю, что у вас неправильная (не Windows Phone) версия System.Net.dll, на которую ссылаются, и это может быть причиной рассматриваемой проблемы. На 7.1 (стандартная установка) должно быть

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\System.Net.dll

Если вы используете 7.0, это должно быть

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone\System.Net.dll
0 голосов
/ 20 января 2012

URL размещен как https?Если да, можете ли вы попробовать нажать URL-адрес из браузера в WP7?

Каков объем данных, поступающих для этого запроса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...