网页API ApiController PUT和POST方法间歇性地收到空参数(Web API Ap

2019-10-18 01:10发布

我ApiController方法有时会收到空参数当我运行在调试器测试。 但是,如果我触摸控制器的文件,并重建它,它工作正常使用相同的测试。 一切都是相同的,除了它重新编译的Web API项目的DLL。 我打开跟踪,但它并没有告诉我,除参数是否为空或没有什么。 这是怎么发生的?

我想这不能反序列化JSON对象到参数类型,但我怎么能解决呢?

编辑:添加代码

这种方法有时接收值=空

public FilterItem Post(uint jobId, uint columnID, FilterItemDTO value)
    {
        // save a new FilterItem
    }

FilterItemDTO是一个DTO类我做只是因为的FilterItem类有一堆不需要的继承领域的,我不能在基类注释它们:

public class FilterItemDTO
{
    public uint Id;
    public uint ColumnID { get; set; }
    public FilterItem.FilterType Type;
    public string Value;

    //Date/Time Stamps
    public DateTime? CreatedDate = null;
    public string CreatedBy = null;
    public DateTime? ModifiedDate;
    public string ModifiedBy = null;
    public int FilterLevel = 0;

    public FilterItemDTO(FilterItem f)
    {
        Id = f.ID;
        ColumnID = f.ColumnID;
        Type = f.Type;
        Value = f.Value;
        FilterLevel = f.FilterLevel;
        CreatedDate = f.CreatedDate;
        CreatedBy = f.CreatedBy;
        ModifiedDate = f.ModifiedDate;
        ModifiedBy = f.ModifiedBy;
    }

    internal static FilterItem ToFilterItem(FilterItemDTO value)
    {
        FilterItem f = new FilterItem(value.Type, value.Value, value.FilterLevel);
        f.ID = value.Id;
        f.ColumnID = value.ColumnID;
        f.CreatedDate = value.CreatedDate;
        f.CreatedBy = value.CreatedBy;
        f.ModifiedDate = value.ModifiedDate;
        f.ModifiedBy = value.ModifiedBy;

        return f;
    }

    public FilterItem ToFilterItem()
    {
        return FilterItemDTO.ToFilterItem(this);
    }
}

这里的请求发送我(从提琴手便签复制)

POST http://localhost:56875/api/job/4513/column/21213/filter HTTP/1.1
Host: localhost:56875
Connection: keep-alive
Content-Length: 28
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://localhost:56875
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31
Content-Type: application/json
Referer: http://localhost:56875/Content/test.htm
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

{"type":"Equal","value":"1"}

这是我的格式化配置。 类型:“公平”的值应该使用StringEnumConverter被自动转换。

 public class FormatterConfig
{
    public static void RegisterGlobalFormatters(MediaTypeFormatterCollection formatters)
    {
        var jsonSerializerSettings = formatters.JsonFormatter.SerializerSettings;
        jsonSerializerSettings.Converters.Add(new IsoDateTimeConverter());

        // serialize every enum as a string
        jsonSerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());

        // include null value fields
        jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore;

        // use camel case
        jsonSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

        // indented formatting
        formatters.JsonFormatter.Indent = true;

        formatters.Remove(formatters.XmlFormatter);
    }
}

Answer 1:

我会尝试先分离出的问题:

  • 注释掉一切,但一个方法,一个控制器,看看它是否仍然受到

  • 做同样的,在隔离每个方法

  • 它们应该是在细隔离那么就意味着可能的方法并不明显分开,也许有时候的WebAPI选择了错误的方法(因为缺少的属性之类的东西)

  • 如果他们仍然失败,失败还是随机的,我会为您在传递任何狡猾的对象 - 尝试重新要求使用招几次检查失败(PARAMS,饼干,接受/内容类型标头它们之间的差异等等。)

  • 通过从app_start调试,多次如果需要的话 - 你可能知道你的失败的模式非常好,只是不断的调试,看看是什么在请求之间改变了

  • 检查是否有任何方法/测试没有覆盖任何配置/以任何其它方式改变该应用程序的状态

  • 试着从你的对象中除去复杂性,使他们只是原始类型,看看有没有什么帮助(如果这样做,就意味着有可能是周围的类型的序列化问题(如继承关系))

  • 改变串行

如果这些方法都可以帮助,张贴一些代码。



文章来源: Web API ApiController PUT and POST methods receive null parameters intermittently