【问题标题】:POST doesn't call the expected methodPOST 没有调用预期的方法
【发布时间】:2020-05-03 10:41:51
【问题描述】:

我正在使用两个或多个 Post 方法开发 ASP.Net Web API。我正在尝试通过 HttpClient 从 api 控制器使用其中一个 Post 方法,但每次调用第一个 Post 方法。 下面是代码

public class JobController : ApiController
{
    [HttpPost]
    public HttpResponseMessage RunJob([FromBody]UserModel User)
    {
    }

[HttpPost]
    public HttpResponseMessage DownloadFile(string ExportStatusGuid, string PartnerGuid, string UserEmail, string Password)
    {
    }
}

而我试图通过 HTTP 客户端使用它是:

using (var client = new HttpClient())
        {
            var arguments = new { ExportStatusGuid, PartnerGuid };
            HttpContent content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(arguments), Encoding.UTF8, "application/json");

            var responseTask = client.PostAsync(ApiUrl + "Job/DownloadFile", content);
            responseTask.Wait();

            if (responseTask.Result.IsSuccessStatusCode)
            {


            }
        }

你可以看到我已经从 JobController 调用了 DownloadFile

var responseTask = client.PostAsync(ApiUrl + "Job/DownloadFile", content);

但不是调用 Job/DownloadFile,而是运行 Job/RunJob 方法。即使我尝试添加路由配置,我也无法找出问题所在。

默认路由配置在这里

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

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

请帮助我解决这个问题。

【问题讨论】:

  • 这与HttpClient无关。您的控制器将 RunJob 公开为 default 发布操作,因为它是唯一具有 [HttpPost] 属性的方法。 DownloadFile 只是一种方法
  • 将 PostAsync 更改为 GetAsync
  • @Shiljo 问题是如何POST,而不是如何GET。无论如何,此控制器中没有 GET 操作
  • 如果你想把DownloadFile变成一个动作,添加HttpPost属性到它
  • 对不起,在复制代码时,我错过了 HttpPost,在应用程序中,两种方法都有 HttpPost 属性。我已经更新了问题

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


【解决方案1】:

更改路由配置

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

【讨论】:

  • @azharrahi 你需要在路由中添加动作名称
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 2022-09-27
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
相关资源
最近更新 更多