在 c# 中使用 RestClient 作为 multipart/form-data 上传文件
Posted
技术标签:
【中文标题】在 c# 中使用 RestClient 作为 multipart/form-data 上传文件【英文标题】:Upload File using RestClient as multipart/form-data in c# 【发布时间】:2018-09-20 05:53:28 【问题描述】:我正在尝试使用 restClient (RestSharp) 请求从 c# 类上传文件。 我正在创建 Method.POST 方法并向此请求添加一个音频文件作为 multipart/form-data。
当我执行请求时服务器抛出异常。
例外:
System.ArgumentNullException: Value cannot be null.
Parameter name: value
at System.Enum.TryParseEnum(Type enumType, String value, Boolean ignoreCase, EnumResult& parseResult)
at System.Enum.Parse(Type enumType, String value, Boolean ignoreCase)
at Groove.Libraries.Helper.EnumHelper.ParseEnum[T](String value) in D:\project\Groove\Web\Groove\Libraries\Helper\EnumHelper.cs:line 47
at Groove.Controllers.Api.DocumentController.
<PostDocumentUpload>d__5.MoveNext()
RestClient 请求代码:
string api_url = "http://localhost:57997/";
var fullFileName = "Adios.mp3";
var filepath = @"C:\Users\Admin\Desktop\Adios.mp3";
RestClient client = new RestClient(ApiModel.api_url);
var request = new RestRequest("api/document", Method.POST);
request.AddFile(Path.GetFileNameWithoutExtension(fullFileName), filepath);
request.AddHeader("Content-Type", "multipart/form-data");
request.AddParameter("ReferenceType",28,ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
服务器代码:
public async Task<object> PostDocumentUpload()
try
// Make temp physical path where file to be saved
var tempPath =
HttpContext.Current.Server.MapPath(string.Format("0/1", Constants.MediaResourceFolder,
Constants.MediaResorceTempFolder));
// Check temporary path is exist or not, if not then create temporary folder
if (!Directory.Exists(tempPath))
Directory.CreateDirectory(tempPath);
// Create object of MyMultipartFormDataStreamProvider class
var stream = new MultipartHelper(tempPath);
// Save file at temp path
await RequestContext.Request.Content.ReadAsMultipartAsync(stream);
// Exception throw from Here,
ReferenceType referenceType = EnumHelper.ParseEnum<ReferenceType>(stream.FormData["ReferenceType"]);
// -------------other code
catch (Exception ex)
return FailureResponse(ex);
我猜问题是 stream.FormData["ReferenceType"] 没有从请求中正确设置。
我不想更改服务器代码。因为当您从邮递员或浏览器调用时它工作正常。
有人可以帮忙吗?谢谢
【问题讨论】:
【参考方案1】:我只是通过更改几个代码找到了解决方案。
更新代码:
var request = new RestRequest("api/document", Method.POST);
request.AddFile(Path.GetFileNameWithoutExtension(fullFileName), filepath);
request.AddParameter("ReferenceType", ReferenceType.ToString());
request.AddParameter("RefId", StudioEventEntryId.ToString());
request.AlwaysMultipartFormData = true;
IRestResponse response = client.Execute(request);
【讨论】:
以上是关于在 c# 中使用 RestClient 作为 multipart/form-data 上传文件的主要内容,如果未能解决你的问题,请参考以下文章
AWS OpsWorks S3 403 RestClient::Forbidden
在 Spring Boot 中使用 Gradle 从 Swagger OpenAPI 生成 RestClient 存根