У меня есть функция ASP.NET (C #, .NET 4.6.1) Web-Api-GET, которая возвращает экземпляр сложного объекта и имеет универсальный тип.Вот определение типа возвращаемого значения (обратите внимание, что в действительности классы очень обширны).
public class FileProcessInstance
{
public FileProcessInstance()
{ }
//ID that identifies file by primary key of log table
public int FileLogID;
//File name without path as received
public string OriginialFileName;
//Path with file name where file can be physically accessed
public string FileSharePath;
}
public class CommonStatusPayload<T> : CommonStatus
{
public CommonStatusPayload() : base(false)
{
Payload = default(T);
}
public CommonStatusPayload(T payload, bool status)
: base(status)
{
Payload = payload;
}
public virtual T Payload { get; private set; }
}
public class CommonStatus
{
public CommonStatus() : this(false)
{
}
public CommonStatus(bool status)
{
Status = status;
}
public bool Status { get; set; }
}
Теперь мой веб-API выглядит следующим образом:
[HttpGet]
public CommonStatusPayload<List<FileProcessInstance>> GetFilesForProcessing()
{
List<FileProcessInstance> lst = new List<FileProcessInstance>() { new FileProcessInstance() { FileLogID = 1, FileSharePath = @"\\d\s", OriginialFileName = "d.txt" } };
CommonStatusPayload<List<FileProcessInstance>> cs = new CommonStatusPayload<List<FileProcessInstance>>(lst, true);
return cs;
}
Проблема в том, что вызовдля этого API из кода C # получит нулевое значение в качестве полезной нагрузки, в то время как запрос Postman действительно получит полезную нагрузку.
Теперь мой код клиента выглядит следующим образом:
static void Main(string[] args)
{
var lst = GetFilesForProcessing();
}
private static List<FileProcessInstance> GetFilesForProcessing()
{
List<FileProcessInstance> lst = new List<FileProcessInstance>();
try
{
Task<CommonStatusPayload<List<FileProcessInstance>>> task = GetFilesForProcessingFromAPI();
task.Wait();
if (task.Result.Payload != null)
lst.AddRange(task.Result.Payload);
}
catch (Exception ex)
{
}
return lst;
}
private static async Task<CommonStatusPayload<List<FileProcessInstance>>> GetFilesForProcessingFromAPI()
{
return await "http://localhost:10748/api/values/GetFilesForProcessing".ToString()
.GetAsync().ReceiveJson<CommonStatusPayload<List<FileProcessInstance>>>();
}
Я заметил, что полезная нагрузка возвратаработает, если бы это был aa) список по его собственному b) локальному экземпляру CommonStatusPayload<List<FileProcessInstance>>
.Это заставляет меня поверить, что возможна проблема десериализации, когда результат передается в код C # из web-api.Проверка скрипача для того же запроса оказывается вполне подходящей, просто клиент C # не получит должный результат.
Любое предположение относительно того, что может быть основной причиной того, что полезная нагрузка равна нулю?