C# HttpClient.PostAsync始终返回404

C# HttpClient.PostAsync始终返回404,c#,rest,http,asp.net-web-api,C#,Rest,Http,Asp.net Web Api,我有一个Xamarin.Forms应用程序,它试图将数据发布到Web API。(WebAPI2和MVC) 我遇到的问题是,我的HttpResponse总是返回404,即使我知道应用程序可以与服务器连接。(获取数据是可以的,发布不是。) Xamarin代码:(客户端-忽略方法的返回类型,我删除了很多业务逻辑!) 值得一提的是,我尝试了服务器端代码的多种变体,包括: 从路由中删除{data}部件。(下面发布的教程有类似的路线,不包括路线。) 在方法签名中包含[FromBody]标记 从我所看到的

我有一个Xamarin.Forms应用程序,它试图将数据发布到Web API。(WebAPI2和MVC)

我遇到的问题是,我的HttpResponse总是返回404,即使我知道应用程序可以与服务器连接。(获取数据是可以的,发布不是。)

Xamarin代码:(客户端-忽略方法的返回类型,我删除了很多业务逻辑!)

值得一提的是,我尝试了服务器端代码的多种变体,包括:

  • 从路由中删除
    {data}
    部件。(下面发布的教程有类似的路线,不包括路线。)
  • 在方法签名中包含
    [FromBody]
    标记
从我所看到的情况来看,我的代码实际上与本文中的
resgisterUser
代码没有什么不同(除了对象名称)


提前谢谢你

代码与示例之间的唯一区别在于,您的代码接收到一个您试图反序列化的
字符串。您应该让ASP.Net为您进行反序列化。换句话说,更改代码如下:

[HttpPost]
[Route("api/BarChart/GetBarChart")]
public HttpResponseMessage GetBarChart(BarChart barChart)
{
    try
    {
       Debug.WriteLine(barChart);
       // do something useful with the barChart...
       return Request.CreateResponse(HttpStatusCode.OK, "true");
    }
    catch (Exception ex)
    {
       return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
    }
}
ASP.Net将请求主体反序列化为
条形图
(前提是您发送的json与
条形图
类型匹配)


顺便说一句:当您实际发布一个方法时,命名一个方法
GetBarChart
,这有点误导。

您是否正确设置了
APIRoot
?您是否尝试过将完整的URL放在代码中而不是构建它?您的Xamarin应用程序试图点击哪个URL?您是否尝试过通过
Fiddler
查看呼叫?
APIRoot
也用于检索数据,效果非常好!还有,为什么要在配置中映射路由并使用
RouteAttribute
s?啊。。。为了解决这个问题,我应该采纳自己的建议,将方法签名更改为“FromBody”,并从路由中删除
{data}
部分。现在我唯一的问题是请求的实际主体是空的。但这是不同日子的不同问题!
    [HttpPost]
    [Route("api/BarChart/GetBarChart/{data}")]
    public HttpResponseMessage GetBarChart(string data)
    {
        try
        {
           BarChart barChart = JsonConvert.DeserializeObject<BarChart>(data, GlobalSettings.JsonSettings);
           return Request.CreateResponse(HttpStatusCode.OK, "true");
        }
        catch (Exception ex)
        {
           return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
        }
    }
    config.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "api/{controller}/{action}/{id}",
         defaults: new { id = RouteParameter.Optional }
    );
[HttpPost]
[Route("api/BarChart/GetBarChart")]
public HttpResponseMessage GetBarChart(BarChart barChart)
{
    try
    {
       Debug.WriteLine(barChart);
       // do something useful with the barChart...
       return Request.CreateResponse(HttpStatusCode.OK, "true");
    }
    catch (Exception ex)
    {
       return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
    }
}