代碼不完整(不會生成),因爲我無法在WriteResponseData()的以下行中獲取「項目」。WebRequest - 爲多個請求異步檢索數據
HttpWebResponse WebResp = (HttpWebResponse)item.EndGetResponse(result);
我必須缺少一些東西。請指出。
下面是完整的代碼: -
static string[] imageUris =
{ "http://www.cricinfo.com/db/PICTURES/CMS/118200/118217.2.jpg",
"http://www.cricinfo.com/db/PICTURES/CMS/117500/117599.2.jpg",
"http://www.cricinfo.com/db/PICTURES/CMS/117500/117598.2.jpg",
"http://www.cricinfo.com/db/PICTURES/CMS/106400/106412.2.jpg",
"http://www.cricinfo.com/db/PICTURES/CMS/106400/106411.2.jpg",
"http://www.cricinfo.com/db/PICTURES/CMS/106200/106275.2.jpg",
"http://www.cricinfo.com/db/PICTURES/CMS/106300/106362.2.jpg"
};
static void Main(string[] args)
{
SendAsynchronousRequests();
Console.WriteLine("All the files have been requested and retrieved...");
Console.ReadLine();
}
static void SendAsynchronousRequests()
{
WebRequest[] requests = InitializeWebRequests();
foreach (var item in requests)
{
Console.WriteLine("Trying to retrieve :-" + item.RequestUri.OriginalString);
item.BeginGetResponse
(
WriteResponseData,
);
}
}
static WebRequest[] InitializeWebRequests()
{
WebRequest[] requests = new WebRequest[imageUris.Length];
int temp = 0;
foreach (var item in imageUris)
{
requests[temp] = WebRequest.Create(item);
//requests[temp].Method = "GET";
temp++;
}
return requests;
}
static void WriteResponseData(IAsyncResult result)
{
HttpWebResponse WebResp = (HttpWebResponse)item.EndGetResponse(result);
Console.WriteLine("WebResp.StatusCode :-" + WebResp.StatusCode);
Console.WriteLine("WebResp.Server :- " + WebResp.Server);
Console.WriteLine("WebResp.ContentLength :- " + WebResp.ContentLength.ToString());
Console.WriteLine(Environment.NewLine);
}
EDIT
所以,該方法的修改後的代碼(這將編譯)將以下內容: -
WebRequest request = (WebRequest)result.AsyncState;
if (result != null && result.IsCompleted)
{
HttpWebResponse WebResp = (HttpWebResponse)request.EndGetResponse(result);
Console.WriteLine("WebResp.StatusCode :-" + WebResp.StatusCode);
Console.WriteLine("WebResp.Server :- " + WebResp.Server);
Console.WriteLine("WebResp.ContentLength :- " + WebResp.ContentLength.ToString());
Console.WriteLine(Environment.NewLine);
}
它給我下面的運行時錯誤: -
Object reference not set to an instance of an object. at WebRequestUsingAPM.Program.WriteResponseData(IAsyncResult result) in \WebRequestUsingAPM\Program.cs:line 73 at System.Net.LazyAsyncResult.Complete(IntPtr userToken) at System.Net.ContextAwareResult.CompleteCallback(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Net.ContextAwareResult.Complete(IntPtr userToken) at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken) at System.Net.HttpWebRequest.ProcessResponse()
編輯: - 我明白了。 result.AsyncState返回null,因爲我在調用BeginGetResponse()時傳遞null,第二個參數是AsyncState並且在那裏傳遞null。我應該將當前的WebRequest對象傳遞給那裏,那樣做。
所以,與其以下內容: -
item.BeginGetResponse
(
WriteResponseData, null
);
我應該通過項目: -
item.BeginGetResponse
(
WriteResponseData, item
);
它提供了運行時錯誤。我更新了我的問題。 – 2010-09-01 08:28:19
我明白了。 result.AsyncState返回null,因爲我在調用BeginGetResponse()時傳遞null,第二個參數是AsyncState並且在那裏傳遞null。我應該將當前的WebRequest對象傳遞給那裏,那樣做。謝謝。 – 2010-09-01 08:40:15