使用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属性。
可能的解决方法是:
也许别人有东西可以添加到该列表中。
干杯,
以上是关于使用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内容类型)