【问题标题】:Posting to web api发布到 web api
【发布时间】:2019-03-11 17:41:34
【问题描述】:

处理发布到 Web api 的最佳或更好的方法是什么?如何通过 C# 完成?

Web API 代码

public class ProcessController : ApiController
{
    [HttpGet]
    public string Test()
    {
        return "Hello from API";
    }


    [HttpPost]
    public IHttpActionResult ApiPost(Model m)
    {
        return Ok();
    }
}

public class Model
{
    public int Id {get; set;}
    public string Name {get; set;}
}

调用web api的代码

HttpClient client = new HttpClient(new HttpClientHandler { UseDefaultCredentials = true });
client.BaseAddress = new Uri("http://localhost:2478/api/Process/");

HttpResponseMessage response = await client.GetAsync("test");

Model m = new Model ();
m.Id= 4;
m.Name = "test";

var r = client.PostAsJsonAsync("ApiPost", m);

这将返回 500 内部服务器错误。这里有什么遗漏吗?

Web API 配置

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var settings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
        settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        settings.Formatting = Formatting.Indented;

        config.MapHttpAttributeRoutes();

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

    }
}

【问题讨论】:

  • 请提供更完整的 Web API 示例。 500 错误表示服务器端错误,但我们只能猜测。
  • @Amy 就是这样。我只是想通过一个帖子。我能够使用单个字符串参数来做到这一点,但我无法成功发布对象。到目前为止,post 方法中没有其他代码。
  • 您可以提供更多的代码。包括控制器。包括您的 global.asax。您正在服务器端做某事,我们无法猜测是什么。您是否在调试器中启动了 Web api 以查看故障所在?如果没有minimal reproducible example,我们无法回答这个问题。
  • 在我看来,您指定的路线不正确,但这与您报告的状态代码不匹配。您可以共享 App_Start 配置文件中的路由配置吗?而不是localhost:2478/api/Process 尝试localhost:2478/Process 作为你的基地址,看看状态码是否开始在400范围内。
  • @VitorPaulino 如果我提出获取请求,则相同的地址有效。只是似乎在本地发帖失败。

标签: c# .net dotnet-httpclient


【解决方案1】:

您是否尝试过:将 FromBody 属性添加到您的模型并在正文中发布与 m 匹配的模型

[HttpPost]
public IHttpActionResult ApiPost([FromBody] Model m)
{
    return Ok();
}

【讨论】:

  • 我确实试过这个。问题原来是为 web api 配置的路由。
【解决方案2】:

更改路由代码以包含解决问题的操作。看起来调用 Web API 的代码工作正常,只要它们是一种 GET 或 POST 方法,因为任何调用都会尝试使用其中之一。

如果没有该操作,它不知道在 API 控制器中使用哪种方法,因为它无法路由到它。

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Dashboard", action = "Index", id = UrlParameter.Optional }
        );
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-20
    • 2013-10-06
    • 2019-05-10
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多