【问题标题】:HttpClient.PostAsJsonAsync content emptyHttpClient.PostAsJsonAsync 内容为空
【发布时间】:2015-07-21 09:36:33
【问题描述】:

我正在尝试使用 ASP.net MVC 将复杂数据类型从一个进程发送到另一个进程。由于某种原因,接收端总是收到空白(零/默认)数据。

我的发送方:

static void SendResult(ReportResultModel result)
{
    //result contains valid data at this point

    string portalRootPath = ConfigurationManager.AppSettings["webHost"];
    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri(portalRootPath);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    HttpResponseMessage resp = client.PostAsJsonAsync("Reports/MetricEngineReport/MetricResultUpdate", result).Result;
    if (!resp.IsSuccessStatusCode) {
    //I've confirmed this isn't happening by putting a breakpoint in here.
    }
}

我的接收方,在不同的类中,在我的本地机器上的不同进程中运行:

public class MetricEngineReportController : Controller
{
    ...
    [HttpPost]
    public void MetricResultUpdate(ReportResultModel result)
    {
        //this does get called, but
        //all the guids in result are zero here :(
    }
    ...
}

我的模型有点复杂:

[Serializable]
public class ReportResultModel
{
    public ReportID reportID {get;set;}
    public List<MetricResultModel> Results { get; set; }
}

[Serializable]
public class MetricResultModel
{
    public Guid MetricGuid { get; set; }
    public int Value { get; set; }

    public MetricResultModel(MetricResultModel other)
    {
        MetricGuid = other.MetricGuid;
        Value = other.Value;
    }

    public MetricResultModel(Guid MetricGuid, int Value)
    {
        this.MetricGuid = MetricGuid;
        this.Value = Value;
    }

}

[Serializable]
public struct ReportID
{
    public Guid _topologyGuid;
    public Guid _matchGuid;
}

知道为什么数据没有到达吗? 任何帮助将不胜感激...

附:出于某种原因,我似乎无法在提琴手上捕捉到 http POST 消息,不知道为什么会这样。

【问题讨论】:

    标签: json asp.net-mvc dotnet-httpclient


    【解决方案1】:

    尝试在 Controller 的 Action 中使用“[FromBody]”参数。当您发布数据时,会将数据传递给不在 url 中的正文。

    [HttpPost]
    public void MetricResultUpdate([FromBody] ReportResultModel result)
    {
        //this does get called, but
        //all the guids in result are zero here :(
    }
    

    【讨论】:

    • 感谢它的帮助!
    【解决方案2】:

    问题是双重的:

    1. 我需要像这样在我的 JSON 帖子中指定类型:

      HttpResponseMessage resp = client.PostAsJsonAsync<MetricResultModel>("Reports/MetricEngineReport/MetricResultUpdate", result.Results[0]).Result;
      
    2. 我的模型的组件没有默认构造函数,这是接收端 JSON 反序列化所必需的。

    【讨论】:

    • 谢谢。几天来我一直在为类似的事情苦苦挣扎,1. 解决了它(已经有默认构造函数)。
    【解决方案3】:

    我也遇到了同样的问题。使用默认的PostAsJsonAsync扩展方法时,似乎content-length标头设置为0,导致服务器忽略请求正文。

    我的解决方案是安装使用新的System.Text.Json 序列化程序的System.Net.Http.Json nuget 包。

    当您添加using System.Net.Http.Json; 时,您应该能够正确使用新的扩展方法PostAsJsonAsync(设置content-length 标头)。

    namespace System.Net.Http.Json
    {
        public static class HttpClientJsonExtensions
        {
            public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, string? requestUri, TValue value, CancellationToken cancellationToken)
            {
                return client.PostAsJsonAsync(requestUri, value, null, cancellationToken);
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2016-01-31
      相关资源
      最近更新 更多