【问题标题】:Web API - Error in sample generationWeb API - 样本生成错误
【发布时间】:2016-09-18 04:42:00
【问题描述】:

我在 ASP.NET web api 中遇到了一个奇怪的问题。我创建了一个泛型类作为所有 Web 方法的返回模型。这是模型的代码:-

public class RequestResponse<T>
{
    public bool Sucess { get; set; }
    public string Message { get; set; }
    public T ReturnedData { get; set; }
    public List<T> ReturnedDataList { get; set; }
}

每当我尝试在这样的 HTTP 方法中使用它时:

public RequestResponse<BillsModel> CreateBill([FromBody] BillsModel billToAdd, MainHelpers.UserType userType)

这是 BillsModel 类:

public class BillsModel
{
    public Guid Id { get; set; }
    public DateTime BillDate { get; set; }
    public long Number { get; set; }
    public Guid OrderId { get; set; }
    public int OrderType { get; set; }
    public Guid PlaceId { get; set; }
    public double TaxPercentage { get; set; }
    public double? DiscountPercentage { get; set; }
    public Guid CreatedBy { get; set; }
    public DateTime CreatedOn { get; set; }
    public Guid? ModifiedBy { get; set; }
    public DateTime? ModifiedOn { get; set; }
}

然后运行api查看方法并选择方法,我看到以下内容:

{
    "Sucess" : true,
    "Message" : "sample string 2",
    "ReturnedData" : {
        "$id" : "2",
        "Id" : "14b479ec-c128-4916-8ed5-c0067c20fd9f",
        "BillDate" : "2016-05-20T21:57:32.530957+02:00",
        "Number" : 3,
        "OrderId" : "dd266c00-0167-49e8-a8f0-0996aca21490",
        "OrderType" : 5,
        "PlaceId" : "98059b6e-acfb-4c89-8c6a-72ef30cce4d6",
        "TaxPercentage" : 7.1,
        "DiscountPercentage" : 1.1,
        "CreatedBy" : "ba106082-44be-4a53-9d32-40bf4ee32bde",
        "CreatedOn" : "2016-05-20T21:57:32.530957+02:00",
        "ModifiedBy" : "3d164ffd-aa1c-40d4-a646-9d6ca91615db",
        "ModifiedOn" : "2016-05-20T21:57:32.530957+02:00"
    },
    "ReturnedDataList" : {
        "$id" : "3",
        "$values" : [{
                "$ref" : "2"
            }, {
                "$ref" : "2"
            }
        ]
    }
}

如您所见,当它是关于一个对象时它工作得很好,但是当它涉及一个列表时,一个未识别的对象显示为“$ref”。 “$id”和“$values”也一样。

你能帮帮我吗?

【问题讨论】:

  • BillsModel 的类定义是什么?它是基于实体框架的吗?也许,这些是与 EF 相关的附加元数据?
  • 不,它是一个用户定义的类,只有普通的属性,如字符串、整数等。我必须这样做,因为当我尝试将 EF 模型直接用作参数或返回类型时,它们会出现问题。
  • 您应该在此处复制/粘贴 JSON 而不是屏幕截图。至于 $... 键,它们是参考。更多关于他们here
  • @Nasreddine 我曾经在该列表中看到普通对象,而不是 $ref 和 $id。我怎样才能避免这种情况?
  • 你能发布BillsModel的定义吗?

标签: c# asp.net asp.net-mvc web-services asp.net-web-api


【解决方案1】:

我创建了以下 Web 服务并使用泛型类型来返回打包数据,但我没有得到你所得到的。你能在一个单独的项目上运行它并查看返回的 JSON 数据吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

public class Account
{
    public int AccountID { get; set; }

}
public class BusinessAccount : Account
{
    public string BusinessAddress { get; set; }
}

public class Package<T>
{
    public T Data { get; set; }
}

/// <summary>
/// using fiddler, I made a request to http://localhost/api/account
/// and got
/// 
/// {"Data":{"BusinessAddress":"ABC","AccountID":123}}
/// 
/// without making any configuration.
///  
/// 
/// </summary>  
namespace test
{
    public class AccountController : ApiController
    {
        // GET api/<controller>
        public Package<BusinessAccount> Get()
        {
            return new Package<BusinessAccount>()
            {
                Data = new BusinessAccount()
                {
                    AccountID = 123,
                    BusinessAddress = "ABC"
                }
            };
        }
    }
}

【讨论】:

  • 什么也没发生。同样的问题仍在发生。
【解决方案2】:

您可以通过在 Application_Start() 方法 Global.asax 的末尾添加它来禁用此行为:

GlobalConfiguration
    .Configuration
    .Formatters
    .JsonFormatter
    .SerializerSettings
    .PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2018-01-16
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多