Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Upload File using RestClient as multipart/form-data in c#

I am trying to upload files from the c# class using restClient (RestSharp) request. I am creating Method.POST method and add one Audio file to this request As multipart/form-data.

Server throws an exception when I execute the request.

Exception :

 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 Request Code :

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);

Server Code :

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);
        }

I guess problem is that stream.FormData["ReferenceType"] is not set correctly from request.

I don't want change the server code. because it working fine when you call from postman or browser.

Can somebody pls help? Thanks

like image 991
Ankit Patel Avatar asked Apr 10 '18 14:04

Ankit Patel


1 Answers

I found the solution by just changing the few codes.

Updated Code :

       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);
like image 105
Ankit Patel Avatar answered Oct 24 '22 08:10

Ankit Patel