2013-03-27 38 views
0

我遇到了一個以前的應用程序不工作在WP8上,WP7上完美工作的問題。HttpWebRequest BeginGetResponse回調沒有射擊WP8(在WP7上工作)

這是我使用的http請求的代碼:

public void SendMessage() 
    {  
     request = WebRequest.Create(uri) as HttpWebRequest; 
     request.Method = "POST"; 
     request.AllowReadStreamBuffering = true; 
     request.ContentType = "application/octet-stream"; 

     try 
     { 
      // get device info 
      String deviceInfo = String.Format("platform,{0};os,{1};width,{2};height,{3};dpi,{4};", 
       Config.PLATFORM_NAME, 
       Environment.OSVersion.Version.ToString(), 
       System.Windows.Application.Current.Host.Content.ActualWidth.ToString(), 
       System.Windows.Application.Current.Host.Content.ActualHeight.ToString(), 
       96); 
      request.Headers["X_MX_DEVICE_INFO"] = deviceInfo; 
     } 
     catch (Exception) {} 

     request.BeginGetRequestStream(new AsyncCallback(ProcessRequestStream), null); 
    } 

    private void ProcessRequestStream(IAsyncResult asyncResult) 
    { 
     if (!message.IsCancelled()) 
     { 
      try 
      { 
       using (Stream stream = request.EndGetRequestStream(asyncResult)) 
       { 
        message.GetRequest(stream); 
       } 
       request.BeginGetResponse(new AsyncCallback(ProcessResponseStream), null); 
      } 
      catch (Exception e) 
      { 
       syncContext.Post(OnEnd, e); 
      } 
     } 
     else 
     { 
      syncContext.Post(OnEnd, null); 
     } 
    } 

    private void ProcessResponseStream(IAsyncResult asyncResult) 
    { 
     if (!message.IsCancelled()) 
     { 
      try 
      { 
       response = (HttpWebResponse)request.EndGetResponse(asyncResult); 
       if (HttpStatusCode.OK != response.StatusCode) 
       { 
        throw new Exception("http status error: " + response.ToString()); 
       } 

       syncContext.Post(SetResponse, response); 
      } 
      catch (Exception e) 
      { 
       syncContext.Post(OnEnd, e); 
      } 
     } 
     else 
     { 
      syncContext.Post(OnEnd, null); 
     } 
    } 

    private void SetResponse(object state) 
    { 
     Exception ex = null; 
     try 
     { 
      using (Stream stream = ((HttpWebResponse)state).GetResponseStream()) 
      { 
       message.SetRespone(stream); 
      } 
     } 
     catch (Exception e) 
     { 
      ex = e; 
     } 
     syncContext.Post(OnEnd, ex); 
    } 

    private void OnEnd(object state) 
    { 
     message.OnEnd((Exception)state); 
    } 
} 

看起來好像BeginGetResponse的回調不會被解僱。我已經嘗試過Fiddler,看看回來會有什麼反應,而且看起來好像什麼都沒有回來,但只是WP8。

任何可能的原因呢?

+0

嘗試var result = request.GetResponse()來確保,如果使用模擬器,還可以從提琴手中追蹤它。 – 2013-03-27 14:28:17

+0

不幸的是,我對提琴手的瞭解很低,因爲這是他第一次需要它。當使用WP8仿真器時,沒有日誌返回fiddler,在WP7仿真器上,我可以像預期的那樣看到fiddler中的響應。 var request = ..似乎沒有幫助的問題.. – 2013-03-27 14:41:07

+0

好的。如果你編碼服務器端,你跟蹤你的查詢真正到達服務器端。我看到你發佈的應用程序/八位字節流,不知道,但你不使用JSON?或者這樣的REST服務。如果你有訪問權限,你可以調試服務器端嗎? – 2013-03-27 14:47:44

回答

0

我相信這可能與在Windows Phone 8

的Referer的問題對於WP7.1: 的Referer標頭值默認爲空。您可以爲Referer頭指定一個自定義值。

對於WP8: Referer頭的值以格式file:/// Applications/Install // Install /引用應用程序的安裝目錄。

周圍有一些互聯網的博客文章,有可能的解決方案:

但在你的情況我還是強烈建議分析提琴手日誌。確保你已經下載並安裝了Fiddler4。另外,請確保您首先啓動提琴手,然後才能啓動WP模擬器。

+0

感謝您的回答。我研究過這個問題,並且wp7模擬器正在發送「file:/// Applications/Install/3F43BD1F-735D-433E-B113-67A4E7640BCA/Install /」,因爲它是引用標題,這看起來是相反的嗎?我沒有看到在fiddler中使用wp8模擬器的任何反應。是不是有一種方法來監控提琴手中的傳出連接以查看它是否正確發送? – 2013-03-27 16:26:01

+0

仔細檢查Fiddler的設置。請參閱Fiddler網站上提供的指南:http://www.fiddler2.com/fiddler/help/phone.asp – Mike 2013-03-27 20:17:59

+0

我已經按照提琴手指示,現在不止一次。Fiddler完美適用於WP7。我想這可能是一個不同的問題造成這一點。在WP8仿真器上,我收到如下警告:線程0x658已退出,代碼爲259(0x103),WP7仿真器上沒有該代碼。我沒有太多的運氣搜索這個,這個錯誤代碼是什麼意思? – 2013-03-28 10:26:22