0

我是一名 Windows Phone 开发人员。我刚刚开始使用异步调用。这是我获取一些元数据的代码。关于它的几点:

  • 我在另一个方法回调中调用了 getmetadata()
  • 我希望cskeys有 5 个值
  • 我检查了我得到 jsessionid
  • 我检查了我正在获取 sessioncookie

有两个功能,GetMetaDataGetFolder_MetadataCallback

  private void GetMetadata()
    {
       try
        {
            foreach (string folderpath in CSKeys) 
            {
                if (!string.IsNullOrEmpty(folderpath))
                {
                    HttpWebRequest FolderMetadataRequest = (HttpWebRequest)WebRequest.Create(new Uri(URL + folderpath));
                    FolderMetadataRequest.Method = DisplayMessage.HeadMethod;
                    FolderMetadataRequest.Headers[DisplayMessage.Header_Authorization] = Authentication_Parameters[DisplayMessage.Username] + DisplayMessage.Colon +
                                                                                         Authentication_Parameters[DisplayMessage.JSessionID]; 
                    FolderMetadataRequest.Headers[DisplayMessage.Header_Cookie] = Authentication_Parameters[DisplayMessage.SessionCookie];

                    FolderMetadataRequest.BeginGetResponse(new AsyncCallback(GetFolder_MetadataCallback), FolderMetadataRequest);
                }
            }
        }
        catch (Exception ex)
        {
        }
    }

    private void GetFolder_MetadataCallback(IAsyncResult asynchronousResult)
    {

        try
        {
            HttpWebRequest FolderReq = (HttpWebRequest)asynchronousResult.AsyncState;
            HttpWebResponse FolderResponse = (HttpWebResponse)FolderReq.EndGetResponse(asynchronousResult);
            if (FolderResponse.StatusCode == HttpStatusCode.OK)
            {
                System.Net.WebHeaderCollection folderMedataCollection = FolderResponse.Headers;
                Dictionary<string, string> FolderMetadata_Header = new Dictionary<string, string>();
                FolderMetadata_Header.Add(DisplayMessage.UniqueID_Key, folderMedataCollection[DisplayMessage.UniqueID_Value]);
                FolderMetadata_Header.Add(DisplayMessage.Actual_Name_Key, folderMedataCollection[DisplayMessage.Actual_Name_Value]);
                FolderMetadata_Header.Add(DisplayMessage.Display_Name_Key, folderMedataCollection[DisplayMessage.Display_Name_Value]);
                FolderMetadata_KeyValues.Add(FolderPath, FolderMetadata_Header);
            }
            app.Storage_Parameters.Add(DisplayMessage.Metadadata_StorageKey, FolderMetadata_KeyValues);
}
        catch (Exception ex)
        {
        }
    }

对于第一个,第二个和第三个,keyvalue(CSKey)我得到了回应。我得到了所有的值,它也被添加到了FolderMetadata_Keyvalues。有时对于第四个和第五个键(CSKey)我得到一个Value cannot be null parameter例外。为什么?

4

1 回答 1

0

即使我得到了所有的值,我也找到了异常的原因。我正在为 foreach 中的每个值提出请求。因为它是异步调用,所以在调用完成之前发送每个值的请求。(即对于 foreach 中的第一个值,请求被发送到回调,在它完成之前第二个值请求被发送到回调函数)。因为这个过程发生异常。

解决方案是,对于异步调用中的 foreach 语句,必须处理等待方法,直到回调完成第一个值请求,或者在回调函数中第一个值的响应之后,必须发送第二个值的请求。

于 2013-08-13T05:55:09.853 回答