C# 使用flurl时ASP.NET Web API可能出现反序列化问题

C# 使用flurl时ASP.NET Web API可能出现反序列化问题,c#,asp.net-web-api,json-deserialization,.net-4.6.1,flurl,C#,Asp.net Web Api,Json Deserialization,.net 4.6.1,Flurl,我有一个ASP.NET(C#,.NET 4.6.1)Web Api GET函数,它返回一个复杂的对象实例,属于泛型类型。下面是返回类型定义(请注意,这些类实际上扩展性很大) 公共类FileProcessInstance { 公共FileProcessInstance() { } //通过日志表的主键标识文件的ID 公共int FileLogID; //接收时没有路径的文件名 公共字符串原始文件名; //具有文件名的路径,可在其中物理访问文件 公共字符串文件共享路径; } 公共类CommonSta

我有一个ASP.NET(C#,.NET 4.6.1)Web Api GET函数,它返回一个复杂的对象实例,属于泛型类型。下面是返回类型定义(请注意,这些类实际上扩展性很大)

公共类FileProcessInstance
{
公共FileProcessInstance()
{ }
//通过日志表的主键标识文件的ID
公共int FileLogID;
//接收时没有路径的文件名
公共字符串原始文件名;
//具有文件名的路径,可在其中物理访问文件
公共字符串文件共享路径;
}
公共类CommonStatusPayload:CommonStatus
{
public CommonStatusPayload():base(false)
{
有效载荷=默认值(T);
}
公共资源状态payload(T有效负载,bool状态)
:基本(状态)
{
有效载荷=有效载荷;
} 
公共虚拟T有效负载{get;私有集;}
}
公共类公共状态
{
public CommonStatus():此(false)
{
}
公共公共资源状态(bool状态)
{
状态=状态;
}  
公共布尔状态{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;
}
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>>>();
        }
[HttpGet]
public CommonStatusPayload GetFilesForProcessing()
{
List lst=new List(){new FileProcessInstance(){FileLogID=1,FileSharePath=@“\\d\s”,OriginialFileName=“d.txt”};
CommonStatusPayload cs=新的CommonStatusPayload(lst,true);
返回cs;
}
问题是,C#code对该api的调用将接收null作为有效负载,而Postman请求确实接收正确的有效负载

现在,我的客户端代码如下所示:

[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;
}
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>>>();
        }
static void Main(字符串[]args)
{
var lst=GetFilesForProcessing();
}
私有静态列表GetFilesForProcessing()
{
List lst=新列表();
尝试
{
Task Task=GetFilesForProcessingFromAPI();
task.Wait();
if(task.Result.Payload!=null)
lst.AddRange(任务、结果、有效载荷);
}
捕获(例外情况除外)
{
}
返回lst;
}
私有静态异步任务GetFilesForProcessingFromAPI()
{
返回等待“http://localhost:10748/api/values/GetFilesForProcessing“.ToString()
.GetAsync().ReceiveJson();
}
我观察到,如果返回的有效载荷是a)由itslef列出的b)CommonStatusPayload的本地实例,则返回的有效载荷可以工作。这让我相信,当结果从web api传递给C#代码时,可能存在反序列化问题。对同一请求进行fiddler检查就可以了,只是C#client不会收到正确的结果


关于有效负载为空的潜在原因有什么猜测吗?

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

我在这里确实发现了一些其他问题,与JSON.NET有关,受保护的setter也有同样的问题