使用HttpClient将文件发布到Web Api

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用HttpClient将文件发布到Web Api相关的知识,希望对你有一定的参考价值。

我正在使用C#和.NET Framework 4.7开发ASP.NET Web Api 2。

我正在尝试使用HttpClient实例将文件上传到web api。

我已将此添加到Web.Config:

<httpRuntime targetFramework="4.7" maxRequestLength="1048576" />

[ ... ]

<location path="ProductionOrderApi">
  <system.web>
    <httpRuntime executionTimeout="120" maxRequestLength="81920" />
  </system.web>
</location>

[ ... ]

<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="1073741824" />
  </requestFiltering>
</security>

这是web api方法:

[HttpPost]
[Route("api/ProductionOrder/{productionOrderName}/Processed")]
public HttpResponseMessage UploadProductionOrderProcessed(
    string productionOrderName,
    byte[] jsonData)
{
    HttpResponseMessage response = null;

    try
    {
        Data.ProductionOrder po = repository
            .SearchFor(p => string.Equals(p.Name, productionOrderName) &&
                        p.Phase == (byte)Phase.Processed)
            .FirstOrDefault();

        if (po == null)
            response = Request.CreateResponse(HttpStatusCode.InternalServerError);
        else
        {
            string json = Encoding.ASCII.GetString(jsonData);

            StoredProcedureErrors error = 
                StoredProcedures.LoadProcessedBatch(connectionString, json);

            if (error == StoredProcedureErrors.NoError)
                response = Request.CreateResponse(HttpStatusCode.Created);
            else
            {
                response = Request.CreateResponse(HttpStatusCode.InternalServerError);

                exceptionLogger.LogMessage(
                    this.GetType().Name,
                    System.Reflection.MethodBase.GetCurrentMethod().Name,
                    "Database error: " + error);
            }
        }
    }
    catch (Exception ex)
    {
        exceptionLogger.LogCompleteException(
            this.GetType().Name,
            System.Reflection.MethodBase.GetCurrentMethod().Name,
            ex);

        response = Request.CreateResponse(HttpStatusCode.InternalServerError);
    }

    return response;
}

这是打电话的客户:

public bool UploadProcessedBatch(string productionOrderName, byte[] jsonData)
{
    string completeUri = string.Format(UploadProcessedBatchUri, productionOrderName);

    return Post<byte[]>(completeUri, jsonData);
}

protected bool Post<T>(string completeUri, T dataToPost)
{
    if (EqualityComparer<T>.Default.Equals(dataToPost, default(T)))
        throw new ArgumentNullException("dataToPost");

    bool result = false;

    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(_webApiHost);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        HttpContent content = new StringContent(JsonConvert.SerializeObject(dataToPost), Encoding.UTF8, "application/json");
        Task<HttpResponseMessage> response = client.PostAsync(completeUri, content);
        HttpResponseMessage message = response.Result;

        result = (message.StatusCode == HttpStatusCode.Created);

        LatestStatusCode = message.StatusCode;
        ReasonPhrase = message.ReasonPhrase;
    }

    return result;
}

如果我在没有张贴任何jsonData的情况下与PostMan打电话,它会接到电话,但当我用任何jsonData打电话时它不会调用它(我在Web Api方法的第一行有一个断点):我得到一个异常说“取消任务”,其他任何有用的东西。

我正在尝试上传它的文件很大(超过7 MB)。

关于它发生了什么的任何想法?

我认为问题是我如何发送数据。我找到的所有示例都是关于使用html表单发送数据,但我还没有找到任何关于如何使用HttpClient发送它的内容。

答案

编辑:

因此,自Web Api 2.1以来,可以使用BSON,一种类似JSON的格式,它能够发送二进制格式的数据。在linked文章中,您甚至可以找到使用HttpClient的示例。

在引入BSON之前,围绕JSON限制的一种常见方法是将二进制编码为base64。

原稿:

缺点是你不能简单地发送一个byte []作为Json属性。

可能的解决方法是:

  1. 在Client / Server上进行Base64解析
  2. 直到现在我还没有意识到的另一种可能性是BSON。查看官方Docsthis线程了解更多信息。

也许别人有东西可以添加到该列表中。

干杯,

以上是关于使用HttpClient将文件发布到Web Api的主要内容,如果未能解决你的问题,请参考以下文章

使用 HttpClient 将字节数组发布到 Web API 服务器

使用 HttpClient 和 RXJS 将数据发布到 Web API withCredentials: true

使用 HttpClient 和 Web API 方法 [FromBody] 参数发布到 Web API 最终为空

发布 JSON 对象 HTTPClient。接收到的值为 NULL WEB API ASP MVC

.NET Core Web API使用HttpClient提交文件的二进制流(multipart/form-data内容类型)

控制台应用程序 HttpClient 发布到 mvc web api