如果标头中指定的版本不存在,则返回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;
    }

如果标头中指定的版本不存在,则返回400错误请求

您应该能够使用Request。WebApi中的CreateErrorResponse返回自定义状态代码:

return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, 
                    new UnauthorizedAccessException("not Authorized."));

希望这能有所帮助。