1

デバッガーでテストを実行すると、ApiController メソッドが null パラメーターを受け取ることがあります。しかし、コントローラ ファイルに触れて再構築すると、同じテストで問題なく動作します。Web Api プロジェクトの DLL を再コンパイルすることを除いて、すべて同じです。トレースをオンにしましたが、パラメーターが null かどうか以外は何もわかりません。これはどのように起こりますか?

JSON オブジェクトをパラメーター型に逆シリアル化できないと思いますが、これをトラブルシューティングするにはどうすればよいですか?

編集:コードが追加されました

このメソッドは時々 value=null を受け取ります

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

FilterItemDTO は、FilterItem クラスに不要な継承フィールドがたくさんあり、基本クラスでそれらに注釈を付けることができないという理由だけで、私が作成した DTO クラスです。

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);
    }
}

これが私が送信したリクエストです(Fiddlerのスクラッチパッドからコピー)

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"}

これが私のフォーマッタ構成です。type:"Equal" 値は、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);
    }
}
4

1 に答える 1