gpt4 book ai didi

c# - 如何仅在响应的 Web API 帮助页面文档中显示参数?

转载 作者:太空狗 更新时间:2023-10-29 20:41:23 25 4
gpt4 key购买 nike

我已经配置了 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 Controller 中有以下方法:

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

现在对于作为 Reading 对象列表的请求参数的文档,它将列出 Reading 的所有属性以及 ResponseBase 类(继承)。我希望帮助页面文档仅将 ErrorReason 列为 Response 中的参数之一。

除了在 ErrorReason 上设置属性 [ApiExplorerSettings(IgnoreApi = true)] 之外,我还能做任何配置吗?如果我这样做,ErrorReason 将在请求和响应参数中均不可用。我只想在响应参数列表中显示它。

最佳答案

通常,最佳做法是创建一个与您想要接受的内容完全匹配的自定义对象。这样做的原因之一是安全性。请参阅“过度发布”和“发布不足”: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
}

然后你会接受 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”存在于响应中,但不存在于请求中。 Request Help Page override

关于c# - 如何仅在响应的 Web API 帮助页面文档中显示参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35505133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com