ASP.NET Web API возможна проблема десериализации при использовании flurl - PullRequest
0 голосов
/ 19 октября 2018

У меня есть функция 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 # не получит должный результат.

Любое предположение относительно того, что может быть основной причиной того, что полезная нагрузка равна нулю?

1 Ответ

0 голосов
/ 20 октября 2018

Я нашел причину этой проблемы.Частный установщик для Payload в классе CommonStatusPayload вызывает сбой десериализации.Хотя для предполагаемого поведения я хотел, чтобы полезная нагрузка была установлена ​​только через конструктор / метод, чтобы всегда быть связанным с относительным статусом, по крайней мере, это изменение позволяет мне продолжить.

Я нашел здесь некоторые другие вопросы, связанные с JSON.NET с защищенными установщиками, имеющими те же проблемы.

...