2017-10-30 3 views
0

.NET RESTアプリケーションで作業中に奇妙な問題が発生しています。私はあらゆる種類の要求をうまく行うことができますが、この1つのlong-polling-GET割り込み要求は、返されたListが空の場合にのみ成功します。説明するために:返されたときにGETリクエストが機能しないList <>には項目が含まれています

public async Task<List<Person>> UpdateRequest() 
{ 
    try 
    { 
     await LongPolling(10000); 
    } 
    catch (TaskCanceledException) 
    { 
     Console.WriteLine("Long polling GET was cancelled."); 
     var fooList = new List<Person>(); 
     fooList.Add(new Person("tim", "bar")); // <- adding this line breaks the request 

     return fooList; 
    } 

    return null; //Timeout, aka nothing happened 
} 

.Add()行がない場合、mysite.com/update(長いGETのとその後の遮断)を呼び出すことが予想される

<ArrayOfPerson xmlns="http://schemas.datacontract.org/stuff" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/> 

を返しますが、Listは項目が含まれている場合、私が取得しますインスタント "応答を取得できませんでした"。 Console.Writelineが表示されます。 ListがC#で動作する方法を誤解していますか?または、戻り値のタイプがTask<List<Person>>で間違っていますか?

編集:通常の配列で試してみましょう:Person[0]は、その中に項目があるかどうかにかかわらず、より大きな配列「応答を取得できませんでした。

+3

結果がコレクションの場合は、決して 'null'を返してはいけません。むしろ空リストを返す。それではイテレータなどを壊しません。 '新しいリストを返す()'または静的な 'EmptyPersonList'を作成します。 –

+0

質問には関係ありませんが、本当です:) –

+0

@Fildorはい。長いポーリングが中断されない場合、GETリクエストが保持され、「タイムアウト」(この場合はnull、変更されます)が返されます。 –

答えて

0

明らかに、犯人はTask<>ではありませんでした。戻り値の型として非同期メソッド(List<Person>)も同じ問題を抱えていました。クライアントは、カスタムオブジェクトの空ではないリストを応答にマップする方法を知りません。これは後で理解できるものです。

UpdateRequest()メソッド内のXMLに明示的にマッピングしました。その結果、Task<XElement>が新しい戻り値型になりました。

関連する問題