C# 在ASP Web API中指定无效参数时返回错误

C# 在ASP Web API中指定无效参数时返回错误,c#,asp.net,web,asp.net-web-api2,C#,Asp.net,Web,Asp.net Web Api2,我正在使用C#和ASP.NET Web API创建一个API,我希望它在使用无法识别的参数时返回一个错误 例如: /api/Events 应该列出一系列事件吗 /api/Events?startTime={{startTime}} 应返回在特定时间开始的事件列表 /api/Events?someRandomInvalidParameter={{something}} 应该返回一个错误 有没有一个很好的配置方法可以做到这一点?如果没有,我如何获得一个参数列表来检查自己。尝试这样的强类型操作

我正在使用C#和ASP.NET Web API创建一个API,我希望它在使用无法识别的参数时返回一个错误

例如:

/api/Events
应该列出一系列事件吗

/api/Events?startTime={{startTime}}
应返回在特定时间开始的事件列表

/api/Events?someRandomInvalidParameter={{something}}
应该返回一个错误


有没有一个很好的配置方法可以做到这一点?如果没有,我如何获得一个参数列表来检查自己。

尝试这样的强类型操作

  public string Get()
        {
            return "I'm alive empty";
        }

  public string Get([FromUri] int id)
        {
            return "I'm alive";
        }
所以正常的呼叫会返回我活着或者我活着是空的

  http://localhost:1578/api/alive?id=1 //OR
  http://localhost:1578/api/alive
但是如果你试着这样称呼它

http://localhost:1578/api/alive?blablabla=1
您将发生此错误 请求的资源不支持http方法“GET”。

尝试这样的强类型操作

  public string Get()
        {
            return "I'm alive empty";
        }

  public string Get([FromUri] int id)
        {
            return "I'm alive";
        }
所以正常的呼叫会返回我活着或者我活着是空的

  http://localhost:1578/api/alive?id=1 //OR
  http://localhost:1578/api/alive
但是如果你试着这样称呼它

http://localhost:1578/api/alive?blablabla=1
您将发生此错误 请求的资源不支持http方法“GET”。

我认为你应该是一个好朋友
示例:

[Route("/app/Events/{startTime})"]
public ApiResponse Get(string startTime)
{
}



不要设置显式参数名称。您应该按照参数的顺序进行管理/检查

我认为您应该使用覆盖方法
示例:

[Route("/app/Events/{startTime})"]
public ApiResponse Get(string startTime)
{
}



不要设置显式参数名称。您应该按参数顺序进行管理/检查

您可以创建一个
操作过滤器
来自动执行此操作:

public class InvalidQueryStringRejectorAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var arguments = actionContext.ActionArguments.Keys;

        var queryString = actionContext.Request.GetQueryNameValuePairs()
            .Select(q => q.Key);

        var invalidParams = queryString.Where(k => !arguments.Contains(k));

        if (invalidParams.Any())
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, new
            {
                message = "Invalid query string parameters",
                parameters = invalidParams
            });
        }
    }
}
该筛选器将拒绝任何查询字符串参数与方法签名不匹配的请求

您可以这样使用它:

[InvalidQueryStringRejector]
public IHttpActionResult Get(string value)
{
    return Ok(value);
}
或者通过在
HttpConfiguration
对象中注册来应用于任何操作:

config.Filters.Add(new InvalidQueryStringRejectorAttribute());

您可以创建一个
ActionFilter
来自动执行此操作:

public class InvalidQueryStringRejectorAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var arguments = actionContext.ActionArguments.Keys;

        var queryString = actionContext.Request.GetQueryNameValuePairs()
            .Select(q => q.Key);

        var invalidParams = queryString.Where(k => !arguments.Contains(k));

        if (invalidParams.Any())
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, new
            {
                message = "Invalid query string parameters",
                parameters = invalidParams
            });
        }
    }
}
该筛选器将拒绝任何查询字符串参数与方法签名不匹配的请求

您可以这样使用它:

[InvalidQueryStringRejector]
public IHttpActionResult Get(string value)
{
    return Ok(value);
}
或者通过在
HttpConfiguration
对象中注册来应用于任何操作:

config.Filters.Add(new InvalidQueryStringRejectorAttribute());

谢谢,安东。即使在一个参数有效而另一个参数无效的情况下,这种方法是否也有效?e、 g.
/api/alive?id=1&bla=1
根据我的有限测试,如果我至少有一个有效参数,它仍将绑定到我的一个Get方法-可能是因为我使用了一些可选参数吗
string startTime=“”
Yes它将工作,因为操作将尝试查找id参数,并将忽略所有其他参数。我怎么能让它不起作用呢?如果用户添加了qwe=2,但它没有任何作用,我希望用户得到通知。请稍等,我将对此进行调查,我认为我们应该更改路由Hanks,Anton。即使在一个参数有效而另一个参数无效的情况下,这种方法是否也有效?e、 g.
/api/alive?id=1&bla=1
根据我的有限测试,如果我至少有一个有效参数,它仍将绑定到我的一个Get方法-可能是因为我使用了一些可选参数吗
string startTime=“”
Yes它将工作,因为操作将尝试查找id参数,并将忽略所有其他参数。我怎么能让它不起作用呢?如果用户添加qwe=2,我希望用户得到通知,但它没有任何作用。请稍等,我将对此进行调查,我认为我们应该更改routesHi Phong,我希望使用参数,因为我不希望像那样显式设置URL。如果我想要有多个可选参数,该怎么办?点餐怎么样?我也不知道人们可能会使用哪些无效参数。这个参数和用户在URL中输入的值的位置相匹配。你好,Phong,我想使用参数,因为我不想这样显式地设置URL。如果我想要有多个可选参数,该怎么办?点餐怎么样?我也不知道人们可能会使用哪些无效参数。这个参数和用户在URL中输入的值的位置相匹配。