C# 强制Http Get接受带或不带参数的请求

C# 强制Http Get接受带或不带参数的请求,c#,.net,asp.net-web-api,webapi,C#,.net,Asp.net Web Api,Webapi,考虑控制器: public class EmployeeController : ApiController { // https://localhost:44344/api/employee/:profession [HttpGet] [Route("api/employee/{profession}")] public HttpResponseMessage Get(String profession) { t

考虑控制器:

public class EmployeeController : ApiController
{
    // https://localhost:44344/api/employee/:profession
    [HttpGet]
    [Route("api/employee/{profession}")]
    public HttpResponseMessage Get(String profession)
    {            

        try
        {
            var someBigList = ...
            /// ... do some stuff
            return Request.CreateResponse(HttpStatusCode.OK, someBigList );
        }
        catch (Exception e)
        {
            // error
        }
    }


}
控制器接受以下形式的请求:

https://localhost:44344/api/employee/:profession
然而当我尝试

https://localhost:44344/api/employee
没有


我们如何修复GET请求以接受两者

根据我的个人经验,如果它不是必需的参数,那么我从查询中获取值,而不是从路由中获取值。
因此,您可以使用[FromQuery]字符串专业,用法如下:

根据我的个人经验,如果它不是必需的参数,则我从查询中获取值,而不是从路由中获取值。
因此,您可以使用[FromQuery]字符串专业,用法如下:

您可以使用?这就是[Routeapi/employee/{profession?}]

或者,如果您希望它在没有给定值的情况下具有默认值,则使用[Routeapi/employee/{profession=value}]


请参阅

中的详细信息。您可以在路线中使用标记可选参数?这就是[Routeapi/employee/{profession?}]

或者,如果您希望它在没有给定值的情况下具有默认值,则使用[Routeapi/employee/{profession=value}]


查看

中的更多信息如果您想同时允许两个URL,则必须再添加一条路由。这将简单地将您的请求路由到action方法。 现在,因为您需要一个参数,所以它应该在请求参数中传递,请求参数将作为查询字符串的一部分

新路线应该如下所示

public class EmployeeController : ApiController
{
    // https://localhost:44344/api/employee/:profession
    [HttpGet]
    [Route("api/employee")]
    [Route("api/employee/{profession}")]
    public HttpResponseMessage Get(String profession)
    {            

        try
        {
            var someBigList = ...
            /// ... do some stuff
            return Request.CreateResponse(HttpStatusCode.OK, someBigList );
        }
        catch (Exception e)
        {
            // error
        }
    }


}

如果您想同时允许两个URL,则必须再添加一个路由。这将简单地将您的请求路由到action方法。 现在,因为您需要一个参数,所以它应该在请求参数中传递,请求参数将作为查询字符串的一部分

新路线应该如下所示

public class EmployeeController : ApiController
{
    // https://localhost:44344/api/employee/:profession
    [HttpGet]
    [Route("api/employee")]
    [Route("api/employee/{profession}")]
    public HttpResponseMessage Get(String profession)
    {            

        try
        {
            var someBigList = ...
            /// ... do some stuff
            return Request.CreateResponse(HttpStatusCode.OK, someBigList );
        }
        catch (Exception e)
        {
            // error
        }
    }


}

公共HttpResponseMessage GetString职业=null@SirRufo:不起作用提醒自己:在一天的第一杯咖啡前不要评论/回答;opublic HttpResponseMessage GetString专业=null@SirRufo:不起作用提醒自己:在一天的第一杯咖啡前不要评论/回答;另一方面,即使有可能,也不要求这样做。如果你使用“应该”,那么请提供基于应该这样做的信息。嗨!谢谢你指出这一点!老实说,这是CS学习期间教给我们的,我认为这是理所当然的,这也是我设计API的方式,但在简短的查找之后,我没有找到任何REST标准。对不起,我的回答有误导性,我很快会修改的!即使有可能,也不需要这样做。如果你使用“应该”,那么请提供基于应该这样做的信息。嗨!谢谢你指出这一点!老实说,这是CS学习期间教给我们的,我认为这是理所当然的,这也是我设计API的方式,但在简短的查找之后,我没有找到任何REST标准。对不起,我的回答有误导性,我很快会修改的!谢谢,但是我得到:{消息:没有找到与请求URI匹配的HTTP资源https://localhost:44344/api/employee”,MessageDetail:在控制器“employee”上找不到与请求匹配的操作。}谢谢,但是我得到了:{消息:未找到与请求URI'匹配的HTTP资源https://localhost:44344/api/employee,MessageDetail:在控制器“employee”上找不到与请求匹配的操作。}