如果标头中指定的版本不存在,则返回400错误请求
本文关键字:返回 请求 错误 不存在 版本 如果 | 更新日期: 2023-09-27 17:59:07
我正在编写一个Web API,并使用路由约束实现版本控制,类似于这里的Web API 2示例。
我有一个类似于下面的IHttpRouteConstraint的实现。我注意到,如果我在请求中传递了一个不存在的版本,那么在为具有约束的路由属性的每个控制器调用Match之后,就会返回404。
在这种情况下,我想返回一个不同的错误。可能是400,带有自定义消息。我不完全确定该怎么做。
所有这些网络内容对我来说都是全新的。
编辑:只是为了澄清。我遇到的问题是,我真的不确定如何测试这种情况,以及在哪里抛出/返回错误。
/// <summary>
/// A Constraint implementation that matches an HTTP header against an expected version value.
/// </summary>
internal class VersionConstraint : IHttpRouteConstraint
{
public const string VersionHeaderName = "api-version";
private const int DefaultVersion = 1;
public VersionConstraint(int allowedVersion)
{
AllowedVersion = allowedVersion;
}
public int AllowedVersion
{
get;
private set;
}
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
{
if (routeDirection == HttpRouteDirection.UriResolution)
{
int version = GetVersionHeader(request) ?? DefaultVersion;
if (version == AllowedVersion)
{
return true;
}
}
return false;
}
private int? GetVersionHeader(HttpRequestMessage request)
{
string versionAsString;
IEnumerable<string> headerValues;
if (request.Headers.TryGetValues(VersionHeaderName, out headerValues) && headerValues.Count() == 1)
{
versionAsString = headerValues.First();
}
else
{
return null;
}
int version;
if (versionAsString != null && Int32.TryParse(versionAsString, out version))
{
return version;
}
return null;
}
您应该能够使用Request。WebApi中的CreateErrorResponse返回自定义状态代码:
return Request.CreateErrorResponse(HttpStatusCode.Unauthorized,
new UnauthorizedAccessException("not Authorized."));
希望这能有所帮助。