POST 没有调用预期的方法

Posted

技术标签:

【中文标题】POST 没有调用预期的方法【英文标题】:POST doesn't call the expected method 【发布时间】: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 属性。我已经更新了问题 【参考方案1】:

更改路由配置

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

【讨论】:

@azharrahi 你需要在路由中添加动作名称

以上是关于POST 没有调用预期的方法的主要内容,如果未能解决你的问题,请参考以下文章

Post 方法没有在 api 调用中发送我的数据

Angular2 http post没有将json对象传递给MVC 6控制器动作

从计算机 visio 调用 ocr api 时,我没有得到预期的结果

android handler调用post方法阻塞

idhttp.post方式 调用datasnap rest 远程方法

servlet中为啥doget要调用dopost?默认调用哪个?默认都调用?