2013-06-19 69 views
1

我試圖將我的項目從Mac上的Xamarin Studio移植到Windows 7上的Visual Studio 2012. 在Mac和XS上工作都很好。於2012年的VisualStudio我那些2個問題:Xamarin上的WebHeaderCollection&HttpWebRequest

錯誤3「System.Net.WebHeaderCollection」不包含一個定義爲 「添加」和沒有擴展方法「添加」接受 類型的第一參數' System.Net.WebHeaderCollection'可以找到(您是否缺少 使用指令或程序集 參考?)C:\ Users \ user \ Documents \ Visual Studio 2012 \ Projects \ MyProject \ MyProject.Core \ Services \ MyProjectService。 cs

錯誤4'System.Net.HttpWebRequest'不包含 'GetResponse'的定義並且沒有擴展名方法'GetResponse'接受第一個 參數的類型'System.Net.HttpWebRequest'可能被發現(你是 缺少使用指令或程序集 參考?)C:\ Users \ user \ Documents \ Visual Studio 2012 \項目\ MyProject的\ MyProject.Core \ SERVICES \該代碼MyProjectService.cs

var request = WebRequest.Create("https://www.myaddress.com/test/") as HttpWebRequest; 
    request.Method = "GET"; 
    request.Accept = "application/json"; 
    request.Headers.Add(HttpRequestHeader.Cookie,"mycookievalue"); 

    // Get response 
    using (var response = request.GetResponse() as HttpWebResponse) 
    { 
     // Get the response stream 
     var reader = new StreamReader(response.GetResponseStream()); 
     content = reader.ReadToEnd(); 
    } 

我怎麼能解決呢?

+0

一個想法:'頭'[「鍵」] =值'工作? – Stuart

+1

我不知道密鑰...我怎麼檢查它(通過RestClient?) –

+0

是不是'HttpRequestHeader.Cookie'的關鍵? – Stuart

回答

6

還有沒有執行你所提到的東西到目前爲止。 但沒關係。他們仍然做得很好!

回答您的問題。

錯誤3.是的。目前,您只能使用標題[「key」] =值。但。不是每個頭。我試圖把「Content-Length」(因爲沒有實現「ContentLength」屬性),但得到了「限制標題」異常。 但是,請求POST爲我成功處理,所以我放了它。

錯誤4.是。沒有這樣的方法。 (同樣的方法,因爲沒有「GetRequestStream」(例如,如果你想寫請求流的POST數據))。好消息是有BeginGetResponse和BeginGetRequestStream分別爲和C#動作方法簡化所有廚房。

(此外,我相信,這對異步實踐的一般理解非常有用)。

基本樣本可在Microsoft official docs上找到。

但用行動做到這一點我用下面的:

public void MakeRequest(string url, string verb, Dictionary<string, string> requestParams, 
     Action<string> onSuccess, Action<Exception> onError) 
    { 
     string paramsFormatted; 

     if (verb == "GET") 
     { 
      paramsFormatted = string.Join("&", requestParams.Select(x => x.Key + "=" + Uri.EscapeDataString(x.Value))); 
      url = url + (string.IsNullOrEmpty(paramsFormatted) ? "" : "?" + paramsFormatted); 
     } 
     else 
     { 
      // I don't escape parameters here, 
      // as Uri.EscapeDataString would throw exception if the parameter length 
      // is too long, so you must control that manually before passing them here 
      // for instance to convert to base64 safely 
      paramsFormatted = string.Join("&", requestParams.Select(x => x.Key + "=" + (x.Value))); 
     } 

     var request = (HttpWebRequest)WebRequest.Create(url); 
     request.Method = verb; 

     requestParams = requestParams ?? new Dictionary<string, string>(); 

     Action goRequest =() => MakeRequest(request, 
      response => 
      { 
       onSuccess(response); 
      }, 
      error => 
      { 
       if (onError != null) 
       { 
        onError(error); 
       } 
      }); 

     if (request.Method == "POST") 
     { 
      request.BeginGetRequestStream(ar => 
      { 
       using (Stream postStream = request.EndGetRequestStream(ar)) 
       { 
        byte[] byteArray = Encoding.UTF8.GetBytes(paramsFormatted); 
        postStream.Write(byteArray, 0, paramsFormatted.Length); 
       } 
       goRequest(); 
      }, request); 
     } 
     else // GET 
     { 
      goRequest(); 
     } 
    } 

    private void MakeRequest(HttpWebRequest request, Action<string> onSuccess, Action<Exception> onError) 
    { 
     request.BeginGetResponse(token => 
     { 
      try 
      { 
       using (var response = request.EndGetResponse(token)) 
       { 
        using (var stream = response.GetResponseStream()) 
        { 
         var reader = new StreamReader(stream); 
         onSuccess(reader.ReadToEnd()); 
        } 
       } 
      } 
      catch (WebException ex) 
      { 
       onError(ex); 
      } 
     }, null); 
    } 
1

要回答錯誤4,我做了兩個擴展方法,這樣我可以有GetRespone()和GetRequestStream()在WebRequest類方法並像原來的版本一樣工作,即阻塞線程。所以它是這樣的:

public static class ExtensionMethods 
{ 
    public static WebResponse GetResponse(this WebRequest request){ 
     ManualResetEvent evt = new ManualResetEvent (false); 
     WebResponse response = null; 
     request.BeginGetResponse ((IAsyncResult ar) => { 
      response = request.EndGetResponse(ar); 
      evt.Set(); 
     }, null); 
     evt.WaitOne(); 
     return response as WebResponse; 
    } 

    public static Stream GetRequestStream(this WebRequest request){ 
     ManualResetEvent evt = new ManualResetEvent (false); 
     Stream requestStream = null; 
     request.BeginGetRequestStream ((IAsyncResult ar) => { 
      requestStream = request.EndGetRequestStream(ar); 
      evt.Set(); 
     }, null); 
     evt.WaitOne(); 
     return requestStream; 
    } 
} 

只要確保將它放在與常規代碼不同的名稱空間中並導入該名稱空間。然後,您將擁有WebRequest實例的GetResponse()方法。哦,還有GetRequestStream()這是有用的發送POST數據