省略某些参数时找不到Web API路由/资源

时间:2014-01-28 20:04:46

标签: asp.net-web-api-routing

在WebApiConfig中,我有以下内容:

config.Routes.MapHttpRoute("Alerts", "alerts/{username}/{scope}/{language}",new { controller = "Alerts", language = RouteParameter.Optional });

在我的AlertsController中,我有这个:

public async Task<HttpResponseMessage> GetAsync(string username, string scope, string language = "en")
    {

        if (string.IsNullOrWhiteSpace(username))
        {
            return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Username cannot be null.");
        }

        if (string.IsNullOrWhiteSpace(scope))
        {
            return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Scope cannot be null.");
        }

        var scp = this._scopeFactory.GetScope(scope);
        var alerts = await scp.GetAlerts(username, scope).ConfigureAwait(false);

        return this.Request.CreateResponse(HttpStatusCode.OK, alerts);
    }

我想要实现的是当我在浏览器中输入http://www.localhost.com/alerts(没有给出用户名和范围),以json格式看“用户名不能为空”和“范围不能为空”。

现在我找不到资源,这是有道理的,因为路由器无法匹配这样的资源。你知道是否有可能通过一些配置改变(或者其他东西)实现我想要的东西?

1 个答案:

答案 0 :(得分:1)

我必须设置可以为空的参数才能使其正常工作。

public async Task<HttpResponseMessage> GetAsync(string username = null, string scope = null, string language = "en")

在WebApiConfig中,我必须将它们作为可选项:

config.Routes.MapHttpRoute("Alerts", "alerts/{username}/{scope}/{language}",new { controller = "Alerts", username = RouteParameter.Optional, scope = RouteParameter.Optional, language = RouteParameter.Optional });