2011-09-22 48 views
2

我有一個寫在我的Windows Phone 7項目中的函數。它將跟蹤每個HttpWebRequest的內容頭,如果內容類型是文檔(如Web郵件中的pdf附件),它將下載它。當文件名是英文時,該功能正常工作。但是,如果文件名不是ascii,例如中文和日文,它會在(HttpWebResponse)m_responseRequest.EndGetResponse(m_responseCallbackAsyncResult)中拋出System.ArgumentException。如何解決它?對我來說很重要,因爲我需要處理大量以中文命名的文件。以下是我的代碼:System.Net.Browser.ClientHttpWebRequest.EndGetResponse當header包含非ascii內容時拋出System.ArgumentException

private void _checkHeader(string m_uri) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(m_uri); 
     request.Method = "POST"; 

     request.BeginGetRequestStream((asynchronousResult) => 
     { 
      var m_readCallBackrequest = (HttpWebRequest)asynchronousResult.AsyncState; 
      m_readCallBackrequest.BeginGetResponse((m_responseCallbackAsyncResult) => 
      { 
       var m_responseRequest = (HttpWebRequest)m_responseCallbackAsyncResult.AsyncState; 
       try 
       { 
        var resp = (HttpWebResponse)m_responseRequest.EndGetResponse(m_responseCallbackAsyncResult); 
        Debug.WriteLine(resp.Headers.ToString()); 

       } 
       catch (WebException) { } 
      }, m_readCallBackrequest); 
     }, request); 
    } 

和異常細節:

System.ArgumentException了未處理 消息= 「」 堆棧跟蹤: 在System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback對象狀態) at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at FotomaxWP71.ViewModel.WebViewModel。 < checkHeader> b _d(IAsyncResult m_responseCallbackAsyncResult) at System.Net.Browser.ClientHttpWebRequest。 <> C_ DisplayClassa.b _8(對象STATE2) 在System.Threading.ThreadPool.WorkItem.WaitCallback_Context(對象狀態) 在System.Threading.ExecutionContext.Run(的ExecutionContext的ExecutionContext,ContextCallback回調,對象狀態) 在系統.Threading.ThreadPool.WorkItem.doWork(對象O) 在System.Threading.Timer.ring() 的InnerException信息:System.ArgumentException 消息= [net_WebHeaderInvalidControlChars] 參數: 調試資源字符串不可用。關鍵和論據常常提供足夠的信息來診斷問題。見http://go.microsoft.com/fwlink/?linkid=106663&Version=4.7.60408.0&File=System.Net.dll&Key=net_WebHeaderInvalidControlChars 參數名:名 堆棧跟蹤:在System.Net.ValidationHelper.CheckBadWebHeaderChars (字符串名稱,布爾isHeaderValue) 在System.Net.WebHeaderCollection.set_Item(字符串名稱,字符串值) 在System.Net.Browser。 HttpWebRequestHelper.AddHeaderToCollection(WebHeaderCollection headerCollection,字符串headerName,字符串headerValue) 處系統System.Net.Browser.HttpWebRequestHelper.ParseHeaders(URI requestUri,SecurityCriticalDataForMultipleGetAndSet`1頭,WebHeaderCollection收集,布爾removeHttpOnlyCookies,HttpStatusCode &狀態,字符串&狀態說明) .Net.Browser.ClientHttpWebRequest.Progress(Object sender,EventArgs e) 在MS.Internal.CoreInvokeHandler.InvokeEventHandler(的Int32 typeIndex,代表handlerDelegate,對象發件人,對象參數) 在MS.Internal.JoltHelper.FireEvent(IntPtr的unmanagedObj,IntPtr的unmanagedObjArgs,的Int32 argsTypeIndex,的Int32 actualArgsTypeIndex,字符串eventName的)

非常感謝!

+1

也許,Web服務器是不正確的內容處置頭編碼非ASCII文件名。使用某些工具(例如fiddler)檢查Web服務器響應標題以確定是否是問題所在。請參閱此鏈接以瞭解此編碼應該如何:http://www.motobit.com/help/scptutl/pa97。htm - 當然,這隻有在您對Web服務器有任何控制時纔會解決問題。 – VinayC

回答

1

變化的代碼try{}這樣:

var resp = (HttpWebResponse)m_responseRequest.EndGetResponse(m_responseCallbackAsyncResult); 
byte[] buf = new byte[resp.Headers.ToString().Length]; 
buf = resp.Headers.ToString().ToCharArray(); 
Debug.WriteLine(buf);