【问题标题】:ASP.NET Web API possible deserialization issue while using flurl使用 flurl 时 ASP.NET Web API 可能的反序列化问题
【发布时间】:2018-10-19 18:59:31
【问题描述】:

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

我观察到,如果返回有效负载是 a) 按其自身列出的列表 b) CommonStatusPayload&lt;List&lt;FileProcessInstance&gt;&gt; 的本地实例,则返回有效负载有效。这让我相信,当结果从 web-api 移交给 C# 代码时,可能存在反序列化问题。对相同请求的提琴手检查结果很好,只是 C# 客户端不会收到正确的结果。

您猜到有效载荷为空的根本原因是什么?

【问题讨论】:

    标签: c# asp.net-web-api json-deserialization .net-4.6.1 flurl


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 2015-02-07
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      相关资源
      最近更新 更多