【问题标题】:asp.net web api 2 How can I accept a query string in POST?asp.net web api 2 如何在 POST 中接受查询字符串?
【发布时间】:2018-04-13 04:18:02
【问题描述】:

我有一个控制器,我试图用查询字符串发布以下内容

http://localhost:53546/api/v1/projects?id=ABA28A61-8898-4739-8464-386C7890E435

但这不会影响控制器POST 方法

不过如此

http://localhost:53546/api/v1/projects/ABA28A61-8898-4739-8464-386C7890E435

如何在帖子中接受查询字符串?我不断收到 504 错误:不支持方法。是否有一些特殊的语法来接受 asp.net web api 中的查询字符串?

这是我的控制器

[RoutePrefix("api/v1/projects")]
public class ProjectController : ApiController
{
    private RestClient client;

    public ProjectController() {
        client = new RestClient("http://localhost:53546");
    }

    [HttpPost]
    [Route("{id:guid}")]
    public string Post(Guid id)
    {
        return "Here is your Post id - " + id.ToString();
    }
}

这是我的DoPost 方法

public JToken DoRequest(string path, string method, params string[] parameters)
{
    if (!path.StartsWith("/"))
    {
        path = "/" + path;
    }
    var fullUrl = url + path + ToQueryString(parameters);

    if (DebugUrls) Console.WriteLine("Requesting: {0}", fullUrl);

    var request = WebRequest.Create(new Uri(fullUrl));
    request.Method = method;
    request.ContentType = "application/json";
    request.ContentLength = 0;
    var response = request.GetResponseAsync().Result;
    using (var responseStream = response.GetResponseStream())
    {
        return ReadResponse(responseStream);
    }
}

如果重要的话,这是我的路线配置

    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

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

【问题讨论】:

  • 您的 URL 与任何路由都不匹配。您为什么希望它起作用?
  • @SLaks 如何将路由匹配到上面的查询字符串?
  • routeTemplate: "api/{controller}/{id}", 已经定义 id 是路由中的默认参数,因此当 URL 中省略 id= 查询字符串参数时它会起作用。

标签: c# json.net asp.net-web-api2 httpwebrequest


【解决方案1】:

如前所述,您已将 id 定义为默认路由的一部分。这意味着当 API 控制器有一个接受 id 作为参数的方法时,路由引擎将期望在 uri 中而不是从查询字符串中找到它。

在上面的 POST 示例中,如果您在 DoRequest 代码中将参数名称从 id 更改为 postId 并将 id 更改为 postId ,那么它应该可以工作。

另一种选择是从您的 routeTemplate 中删除 {id} 并删除 id 的默认值。

【讨论】:

  • 谢谢,这是有道理的。
【解决方案2】:

查询字符串不是路由的一部分。

因此,您需要添加[Route("")] 以添加一个额外的路由,该路由不会向控制器的前缀添加任何内容。

【讨论】:

猜你喜欢
  • 2019-12-07
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多