首页 > 解决方案 > 将对象数据从控制台应用程序发布到 Web API

问题描述

我正在.Net Core 中创建一个控制台应用程序,该应用程序从 Web API 获取数据,更新该数据并执行 Put 以更新 Web API 数据。我遇到了一个问题,当我将数据发送到 HttpContent 时,我在 HttpRequestBuilder 中丢失了我的数据,并且 Web API 没有得到更新,但我得到了 200 返回。有什么想法我可能做错了吗?

控制器:

public static async Task<HttpResponseMessage> UpdateTransaction(Transaction transaction)
{
    var requestUri = $"{baseUri}transactions/{transaction.ID}";
    return await HttpRequestFactory.Put(requestUri, transaction);
}

json内容:

public JsonContent(object value, string mediaType)
        :base(JsonConvert.SerializeObject(value), Encoding.UTF8, mediaType)
{
}

HttpRequestFactory:

public static async Task<HttpResponseMessage> Put(string requestUri, object value)
{
    var builder = new HttpRequestBuilder()
        .AddMethod(HttpMethod.Put)
        .AddRequestUri(requestUri)
        .AddContent(new JsonContent(value, "application/json"));

    return await builder.SendAsync();
}

HttpRequestBuilder:

 public HttpRequestBuilder AddContent(HttpContent content)
{
    this.content = content;
    return this;
}

public async Task<HttpResponseMessage> SendAsync()
{
    // Check required arguments
    EnsureArguments();

    // Setup request
    var request = new HttpRequestMessage
    {
        Method = this.method,
        RequestUri = new Uri(this.requestUri)
    };

    if (this.content != null)
        request.Content = this.content;

    request.Headers.Accept.Clear();
    if (!string.IsNullOrEmpty(this.acceptHeader))
        request.Headers.Accept.Add(
            new MediaTypeWithQualityHeaderValue(this.acceptHeader));

    // Setup client
    var client = new HttpClient();
    client.Timeout = this.timeout;

    var response = await client.SendAsync(request);

    return response;
}

标签: c#asp.net-web-apiasp.net-coreconsole-application

解决方案


我不认为JsonContent班级正在做正确的事情。我们缺少完整的类定义,所以我只能猜测:

当您在Put方法中调用它时,它会返回一个对象,.AddContent但这可能不会被序列化为内容字符串。

更改您的Put方法以直接调用该JsonConvert方法。

HttpRequestFactory:

public static async Task<HttpResponseMessage> Put(string requestUri, object value)
{
    var builder = new HttpRequestBuilder()
        .AddMethod(HttpMethod.Put)
        .AddRequestUri(requestUri)
        .AddContent(JsonConvert.SerializeObject(value, Encoding.UTF8, "application/json"));

    return await builder.SendAsync();
}

如果您确实想使用您的JsonContent类,那么使用静态方法而不是类层次结构可能会更好?


推荐阅读