2012-12-31 37 views
0

我一直在试图让HTTPRequest在我的C#项目中工作,发现GET请求,我无法完成它的工作。下面是我的代码:WP8上的HttpWebRequest

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.IO; 
using System.Windows; 
using System.Diagnostics; 
using System.Threading; 

class MyClass 
{ 
    const string URL_PREFIX = "http://mycompany.com/"; 
    private HttpWebRequest objRequest = null; 
    private static string myRequestData = string.Empty; 
    private string urlAddress; 


    public MyClass() 
    { 
     int member = 1; 
     int startLoc = 1; 
     int endLoc = 1; 
     string starttime = "2012-01-01 00:00:00"; 
     string endtime = "2012-01-01 00:00:00"; 
     int rt = 1; 
     string cmt = "Hello World"; 

     this.urlAddress = URL_PREFIX + string.Format(
     "createtrip.php?member={0}&startLoc={1}&endLoc={2}&starttime={3}&endtime={4}&rt={5}&cmt={6}" 
     , member, startLoc, endLoc, starttime, endtime, rt, cmt); 

     StringBuilder completeUrl = new StringBuilder(urlAddress); 
     objRequest = (HttpWebRequest)WebRequest.Create(urlAddress); 
     objRequest.ContentType = "application/x-www-form-urlencoded"; 

     objRequest.BeginGetRequestStream(new AsyncCallback(httpComplete), objRequest); 
    } 
    private static void httpComplete(IAsyncResult asyncResult) 
    { 
     HttpWebRequest objHttpWebRequest = (HttpWebRequest)asyncResult.AsyncState; 
     // End the operation 
     Stream postStream = objHttpWebRequest.EndGetRequestStream(asyncResult); 
     // Convert the string into a byte array. 
     byte[] byteArray = Encoding.UTF8.GetBytes(myRequestData); 
     // Write to the request stream. 
     postStream.Write(byteArray, 0, myRequestData.Length); 
     postStream.Close(); 

     // Start the asynchronous operation to get the response 
     objHttpWebRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), objHttpWebRequest); 

    } 
    private static void GetResponseCallback(IAsyncResult asyncResult) 
    { 
     HttpWebRequest objHttpWebRequest = (HttpWebRequest)asyncResult.AsyncState; 
     HttpWebResponse objHttpWebResponse = (HttpWebResponse)objHttpWebRequest.EndGetResponse(asyncResult); 
     Stream objStreamResponse = objHttpWebResponse .GetResponseStream(); 
     StreamReader objStreamReader = new StreamReader(objStreamResponse); 
     string responseString = objStreamReader.ReadToEnd();   // Got response here 
     MessageBox.Show("RESPONSE :" + responseString); 
     // Close the stream object 
     objStreamResponse .Close(); 
     objStreamReader.Close(); 
     objHttpWebResponse.Close(); 
    } 

} 

我目前得到的错误是:

An exception of type 'System.Collections.Generic.KeyNotFoundException' occurred in mscorlib.ni.dll and wasn't handled before a managed/native boundary A first chance exception of type 'System.Net.ProtocolViolationException' occurred in System.Windows.ni.dll Operation is not valid due to the current state of the object.

+0

你能说说“不行”吗?另外,你的URL搞砸了,你在'“http://mycompany.com”'和'“createtrip.php”' – Matthew

+0

之间没有斜线。对不起,这是一个SO的临时URL。我已经修改了主要帖子,并提供了更改和错误消息。 –

+0

您是否有堆栈跟踪发生错误的位置? – Matthew

回答

1

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx

不能使用方法 “BeginGetRequestStream” 用GET或HEAD请求(GET是第一个HTTP请求中默认的那个)。

更改为使用“BeginGetResponse”,正如您在代码的第二部分中所做的一样。

+0

嗨,我想知道你是否已经解决了“绘制kdop”的问题,也许你想了很久这个问题。不过,如果你能帮我解决同样的问题,我将非常感激。希望你的回复。我的电子邮件是:[email protected]。 – tanglei

+0

我确实调用了BeginGetResponse spAuthReq.BeginGetResponse(新的AsyncCallback(GetResponsetStreamCallback),spAuthReq); 但我得到的答复作为System.Windows.ni.dll 中发生类型'System.Net.ProtocolViolationException'的第一次机会异常错误:具有此方法的请求不能有请求正文。 – obaid

2

我建议你使用功能强大的库“Microsoft HTTP Client Libraries”,它需要.NET 4并且可以与WP7,WP8,Silverlight 4-5,Windows Store应用程序,可移植类库一起使用。

您可以简单地从NuGet中添加它,并非常简单地使用它。

下面是一个HTTP GET的例子。

 private async Task PerformGet() 
     { 
      HttpClient client = new HttpClient(); 
      HttpResponseMessage response = await client.GetAsync(myUrlGet); 
      if (response.IsSuccessStatusCode) 
      { 
       // if the response content is a byte array 
       byte[] contentBytes = await response.Content.ReadAsByteArrayAsync(); 

       // if the response content is a stream 
       Stream contentStream = await response.Content.ReadAsStreamAsync(); 

       // if the response content is a string (JSON or XML) 
       string json = await response.Content.ReadAsStringAsync(); 

       // your stuff.. 
      } 
     }