将 RestSharp 请求转换为 HttpClient 请求
Translating RestSharp request to HttpClient request
我正在以编程方式将文件上传到远程服务器。这些文件相当大,我想向我的用户提供一份进度报告,以便他们可以看到正在发生的事情。我能够使用 Postman 实现上传,这有助于将整个过程转换为 RestSharp。
但是 RestSharp 不提供任何类型的进度跟踪。我尝试使用 HttpClient 实现相同的功能,但它在某个地方出错了,服务器只是抛出一个“400 - Bad Request”而没有告诉它到底有什么不好(它的 API 文档也不适合胆小的人).
因此,这是 Postman / RestSharp 提供的并且正在运行的功能:
var client = new RestClient("https://opencast/ingest/addMediaPackage");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Basic FooBarBaz=");
request.AddParameter("creator", file.Creator);
request.AddParameter("title", file.Title);
request.AddParameter("flavor", "presentation/source");
request.AddParameter("description", file.Description);
try
{
request.AddFile("BODY", path);
IRestResponse response = await client.ExecuteAsync(request);
_logger.LogInformation($"Response after file upload: {response.StatusCode}");
File.Delete(path);
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception when uploading files: {Message}", ex.Message);
}
这是我尝试用HttpClient(没有try-catch)做的事情:
var request = new HttpRequestMessage(HttpMethod.Post, $"https://opencast/ingest/addMediaPackage");
request.Headers.Add("Authorization", "Basic FooBarBaz=");
using var form = new MultipartFormDataContent();
using var fileContent = new ByteArrayContent(await File.ReadAllBytesAsync(path));
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
form.Add(fileContent, "BODY", Path.GetFileName(path));
form.Add(new StringContent(file.Creator), "creator");
form.Add(new StringContent(file.Title), "title");
form.Add(new StringContent("presentation/source"), "flavor");
form.Add(new StringContent(file.Description), "description");
request.Content = form;
var client = clientFactory.CreateClient(); //which is a IHttpClientFactory
var response = await client.SendAsync(request);
此代码将文件发送到服务器,服务器在完成上传后抛出 400。
目前看不出区别。我可以拦截请求以查看它们的不同之处,但也许这里有人可以立即看到问题?
更新:它变得更奇怪了。如果我只是使用 clientFactory.PostAsync(form)
并通过 form.Add
添加 Auth headers 然后我得到一个 200(即成功)但是服务器只是吞下了文件。
好的,我找到了解决方案。我不确定 WTF 是我还是服务器背后的人,但是...
...您需要添加文件内容 last.
是的,参数的顺序对此很重要。
我正在以编程方式将文件上传到远程服务器。这些文件相当大,我想向我的用户提供一份进度报告,以便他们可以看到正在发生的事情。我能够使用 Postman 实现上传,这有助于将整个过程转换为 RestSharp。 但是 RestSharp 不提供任何类型的进度跟踪。我尝试使用 HttpClient 实现相同的功能,但它在某个地方出错了,服务器只是抛出一个“400 - Bad Request”而没有告诉它到底有什么不好(它的 API 文档也不适合胆小的人).
因此,这是 Postman / RestSharp 提供的并且正在运行的功能:
var client = new RestClient("https://opencast/ingest/addMediaPackage");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Basic FooBarBaz=");
request.AddParameter("creator", file.Creator);
request.AddParameter("title", file.Title);
request.AddParameter("flavor", "presentation/source");
request.AddParameter("description", file.Description);
try
{
request.AddFile("BODY", path);
IRestResponse response = await client.ExecuteAsync(request);
_logger.LogInformation($"Response after file upload: {response.StatusCode}");
File.Delete(path);
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception when uploading files: {Message}", ex.Message);
}
这是我尝试用HttpClient(没有try-catch)做的事情:
var request = new HttpRequestMessage(HttpMethod.Post, $"https://opencast/ingest/addMediaPackage");
request.Headers.Add("Authorization", "Basic FooBarBaz=");
using var form = new MultipartFormDataContent();
using var fileContent = new ByteArrayContent(await File.ReadAllBytesAsync(path));
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
form.Add(fileContent, "BODY", Path.GetFileName(path));
form.Add(new StringContent(file.Creator), "creator");
form.Add(new StringContent(file.Title), "title");
form.Add(new StringContent("presentation/source"), "flavor");
form.Add(new StringContent(file.Description), "description");
request.Content = form;
var client = clientFactory.CreateClient(); //which is a IHttpClientFactory
var response = await client.SendAsync(request);
此代码将文件发送到服务器,服务器在完成上传后抛出 400。 目前看不出区别。我可以拦截请求以查看它们的不同之处,但也许这里有人可以立即看到问题?
更新:它变得更奇怪了。如果我只是使用 clientFactory.PostAsync(form)
并通过 form.Add
添加 Auth headers 然后我得到一个 200(即成功)但是服务器只是吞下了文件。
好的,我找到了解决方案。我不确定 WTF 是我还是服务器背后的人,但是...
...您需要添加文件内容 last.
是的,参数的顺序对此很重要。