0

私は Windows Phone の開発者です。非同期呼び出しを使い始めたばかりです。これは、メタデータを取得するための私のコードです。それについてのいくつかのポイント:

  • 別のメソッドのコールバック内で getmetadata() を呼び出していました
  • 私は5つの値を持つことを期待cskeysしています
  • 私はjsessionidを取得していることを確認しました
  • セッションクッキーを取得していることを確認しました

次の 2 つの機能がありGetMetaDataますGetFolder_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)
        {
        }
    }

1 番目、2 番目、3 番目についてはkeyvalue(CSKey)、応答を得ています。私はすべての値を取得しており、それもに追加されていFolderMetadata_Keyvaluesます。4 番目と 5 番目のキー (CSKey) でValue cannot be null parameter例外が発生することがあります。なんで?

4

1 に答える 1

0

すべての値を取得しているにもかかわらず、例外の理由を見つけました。foreach の各値をリクエストしています。非同期呼び出しであるため、各値のリクエストは呼び出しが完了する前に送信されます (つまり、foreach の最初の値については、リクエストがコールバックに送信され、2 番目の値のリクエストがコールバック関数に送信されます)。このプロセスで例外が発生します。

解決策は、非同期呼び出しの foreach ステートメントの場合、コールバックが最初の値の要求を完了するまで待機メソッドを処理するか、コールバック関数の最初の値の応答の後に 2 番目の値の要求を送信する必要があることです。

于 2013-08-13T05:55:09.853 に答える