【问题标题】:c# webapi query string routingc# webapi查询字符串路由
【发布时间】:2019-01-08 16:00:02
【问题描述】:

下面是我的控制器和动作:

[RoutePrefix("api/PaymentManagementController")]
public class PaymentManagementController : ApiController
{
    [HttpGet]
    [Route("")]
    public HttpResponseMessage CheckStatus(string commandType, string account, string txnId)
    {
    }
}

这里是 WebApi.config:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/",
    defaults: new { id = RouteParameter.Optional }

此链接有效:

localhost:59253/api/PaymentManagementController?commandType=check&account=ParamValue1&txnId=SomePrefix0123456789

但是,我希望它是:

localhost:59253/api/PaymentManagementController/CheckStatus?commandType=check&account=ParamValue1&txnId=SomePrefix0123456789

即使将路由标记如下:

[RoutePrefix("api/PaymentManagementController")]
public class PaymentManagementController : ApiController
{
    [HttpGet]
    [Route("CheckStatus/{commandType}/{account}/{txnId}")]
    public HttpResponseMessage CheckStatus(string commandType, string account, string txnId)
    {
    }
}

我收到错误:

未找到与请求 URI 'localhost:59253/api/PaymentManagementController?commandType=check&account=ParamValue1&txnId=SomePrefix0123456789' 匹配的 HTTP 资源。 在与请求匹配的控制器“PaymentManagement”上未找到任何操作。

【问题讨论】:

  • 我相信您应该为“CheckStatus/{commandType}/{account}/{txnId}”测试的路线应该是 'localhost:59253/api/PaymentManagementController/CheckStatus/check/ParamValue1/SomePrefix0123456789'鉴于您的第二个路由,第一个,控制器工作正常,因为您将 null 字符串分配给该方法。

标签: c# asp.net-web-api binding routing query-string


【解决方案1】:

改变你的路线到

[HttpGet]
    [Route("CheckStatus")]
    public HttpResponseMessage CheckStatus(string commandType, string account, string txnId)
    {
    }

【讨论】:

    【解决方案2】:

    正如我在上面发布的,

    [RoutePrefix("api/PaymentManagementController")]
    public class PaymentManagementController : ApiController
    {
        [HttpGet]
        [Route("CheckStatus")]
        public HttpResponseMessage CheckStatus(string commandType, string account, string txnId)
        {
        }
    

    使用测试网址:

    localhost:59253/api/PaymentManagementController/CheckStatus?commandType=check&account=ParamValue1&txnId=SomePrefix0123456789

    但您尝试的第二种模式更现代:

    [RoutePrefix("api/PaymentManagementController")]
    public class PaymentManagementController : ApiController
    {
        [HttpGet]
        [Route("CheckStatus/{commandType}/{account}/{txnId}")]
        public HttpResponseMessage CheckStatus(string commandType, string account, string txnId)
        {
        }
    }
    

    您应该使用 URL 进行测试

    localhost:59253/api/PaymentManagementController/CheckStatus/check/ParamValue1/SomePrefix0123456789

    【讨论】:

      【解决方案3】:

      您在控制器上定义属性,它使用 属性路由 按预期工作。属性路由中定义的 url 的工作方式如下:Route Prefix / Route / Parameters,对于您的代码,它将适用于 api/PaymentManagementController?commandType=check&account=ParamValue1&txnId=SomePrefix0123456789

      要获得工作请求的 url,请尝试以下代码:

      [RoutePrefix("api/PaymentManagementController")]
      public class PaymentManagementController : ApiController
      {
          [HttpGet]
          [Route("CheckStatus")]
          public HttpResponseMessage CheckStatus(string commandType, string account, string txnId)
          {
          }
      }
      

      【讨论】:

        【解决方案4】:

        从 RoutePrefix 中删除“控制器”或删除整个属性 - 控制器会自动映射。

        [RoutePrefix("api/PaymentManagement")]
        

        在没有控制器的情况下使用预期的链接:

        localhost:59253/api/PaymentManagement/CheckStatus?commandType=check&account=ParamValue1&txnId=SomePrefix0123456789

        我会选择:

        public class PaymentManagementController : ApiController
        {
            public HttpResponseMessage CheckStatus(string commandType, string account, string txnId)
            {
            }
        }
        

        与控制器的预期链接:

        localhost:59253/api/PaymentManagementController/CheckStatus?commandType=check&account=ParamValue1&txnId=SomePrefix0123456789

        public class PaymentManagementControllerController : ApiController
        {
            public HttpResponseMessage CheckStatus(string commandType, string account, string txnId)
            {
            }
        }
        

        【讨论】:

          【解决方案5】:
              Try it.
              [HttpGet]
              [Route("CheckStatus")]
              public HttpResponseMessage CheckStatus(string commandType, string account, string txnId)
              {
              }
          

          【讨论】:

          • 请尝试在答案中添加您所做的说明。
          猜你喜欢
          • 2019-05-10
          • 2017-03-26
          • 1970-01-01
          • 2015-04-12
          • 1970-01-01
          • 1970-01-01
          • 2016-10-23
          • 2010-11-01
          • 2018-10-24
          相关资源
          最近更新 更多