7

Web API ヘルプ ページのドキュメントを構成しました。

私は他のモデルクラスに継承される以下のクラスを持っています。

public class ResponseBase
{
    public string ErrorReason { get; set; }
    [IgnoreDataMember]
    public bool IsRejected { get; set; }
}

IsRejected をシリアル化して応答で利用できるようにしたくないので、IgnoreDataMember 属性で装飾しました。

ResponseBaseを継承したモデルクラスの例。

public class Reading : ResponseBase
{
    //Other properties
}

Web API コントローラーのメソッドを以下に示します。

[HttpPost]
[ValidationResponseFilter]
[Route("")]
[ResponseType(typeof(Reading))]
public IHttpActionResult Add(List<Reading> readingList)
{
    //Logic here
}

ここで、Reading オブジェクトのリストであるリクエスト パラメーターのドキュメントとして、Reading のすべてのプロパティと ResponseBase クラス (継承) を一覧表示します。ヘルプ ページのドキュメントに、ErrorReason を Response のみのパラメーターの 1 つとしてリストアップしてほしい。

[ApiExplorerSettings(IgnoreApi = true)]ErrorReason に属性を設定する以外にできる設定はありますか? これを行うと、ErrorReason は要求パラメーターと応答パラメーターの両方で使用できなくなります。Response Parameters リストのみに表示したい。

4

2 に答える 2

0

一般に、ベスト プラクティスは、受け入れたいものと正確に一致するカスタム オブジェクトを作成することです。その理由の 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」が存在しますが、要求には存在しません。 ヘルプページのオーバーライドをリクエスト

于 2016-02-27T16:49:25.833 に答える