一般に、ベスト プラクティスは、受け入れたいものと正確に一致するカスタム オブジェクトを作成することです。その理由の 1 つはセキュリティです。「over-posting」と「under-posting」を参照
してください: http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-apiこれにより、必要なプロパティのみを持つ新しいオブジェクトが作成されます。
public class ResponseBaseVM
{
public string ErrorReason { get; set; }
/*public bool IsRejected { get; set; }*/
}
public class ReadingVM : ResponseBaseVM
{
//Other properties that you only want available to user
}
次に、List of ReadingVM を取得しますが、応答タイプは引き続き typeof(reading) になります。
[HttpPost]
[ValidationResponseFilter]
[Route("")]
[ResponseType(typeof(List<Reading>))] //will still display response with IsRejected
public IHttpActionResult Add(List<ReadingVM> readingListVM)
{
//Logic here
}
--- 回避策 ---
繰り返しますが、上記の方法に従うべきだと思います。あなたは回避策を求めましたが、ここにあります。HelpPageConfigurationExtensions.cs クラスで「GenerateApiModel」メソッドを見つけて、これに置き換えます。
private static HelpPageApiModel GenerateApiModel(ApiDescription apiDescription, HttpConfiguration config)
{
HelpPageApiModel apiModel = new HelpPageApiModel()
{
ApiDescription = apiDescription,
};
ModelDescriptionGenerator modelGenerator = config.GetModelDescriptionGenerator();
HelpPageSampleGenerator sampleGenerator = config.GetHelpPageSampleGenerator();
GenerateUriParameters(apiModel, modelGenerator);
GenerateRequestModelDescription(apiModel, modelGenerator, sampleGenerator);
GenerateResourceDescription(apiModel, modelGenerator);
GenerateSamples(apiModel, sampleGenerator);
//This will remove request body parameters from your Api Help Page matching 'IsRejected'
var isRejectedParameter = apiModel.RequestBodyParameters.SingleOrDefault(x => x.Name == "IsRejected");
if (isRejectedParameter != null)
apiModel.RequestBodyParameters.Remove(isRejectedParameter);
//This will remove elements with 'IsRejected' for the Help Page sample requests
var sampleRequests = new Dictionary<MediaTypeHeaderValue, object>();
foreach (var kvp in apiModel.SampleRequests)
{
//1.) iterate through each object in SampleRequests dictionary.
//2.) modify the json or xml to remove the "IsRejected" elements
//3.) assign modified results to a new dictionary
//4.) change the HelpPageApiModel. SampleRequests setter to be not private
//5.) assign new dictionary to HelpPageApiModel.SampleRequests
if (Equals(kvp.Key, new MediaTypeHeaderValue("application/json")))
{
var jObject = JObject.Parse(kvp.Value.ToString());
jObject.Remove("IsRejected");
sampleRequests.Add(new MediaTypeHeaderValue("application/Json"), jObject.ToString());
}
else if(Equals(kvp.Key, new MediaTypeHeaderValue("text/json")))
{
//do stuff
}
else if (Equals(kvp.Key, new MediaTypeHeaderValue("application/xml")))
{
//do stuff
}
else if (Equals(kvp.Key, new MediaTypeHeaderValue("text/xml")))
{
//do stuff
}
else
{
//form urlencoded or others
sampleRequests.Add(kvp.Key,kvp.Value);
}
}
apiModel.SampleRequests = sampleRequests;
return apiModel;
}
ご覧のとおり、応答には「IsRejected」が存在しますが、要求には存在しません。
