1

我有一个 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; }   
}

现在我的 web 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;
}

问题是,从 C# 代码调用此 api 会收到 null 作为有效负载,而 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>>。这让我相信,当结果从 web-api 交给 C# 代码时,可能存在反序列化问题。对相同请求的提琴手检查结果很好,只是 C# 客户端不会收到正确的结果。

关于有效载荷为空的根本原因可能是什么?

4

1 回答 1

1

我找到了这个问题的根本原因。CommonStatusPayload 类中 Payload 的私有设置器导致反序列化失败。尽管对于预期的行为,我希望仅通过构造函数/方法设置有效负载始终与相对状态相关联,但至少此更改允许我继续。

我确实在这里找到了一些其他问题,这些问题与 JSON.NET 相关,受保护的设置器也有同样的问题。

于 2018-10-19T21:17:28.163 回答