如何使用Restsharp使用multipart / form-data上传XML文件?

时间:2018-03-16 14:27:40

标签: c# rest multipartform-data restsharp dotnet-httpclient

问题:如何使用Restsharp使用multipart / form-data上传XML文件?

问题:

我正在使用Peppol使用Codabox API发送发票 我想将xml上传到其余服务。
其余服务本身由提供商Codabox控制 我提供了两种我希望做同样的方法。

首先使用Postman和httpclient,一切正常。 我想从使用restsharp方式的httpclient方法中获得相同的结果。

RestSharp版本:106.2.1

  

使用Restsharp

的错误消息      

response =“StatusCode:BadRequest,Content-Type:application / json,   内容长度:-1)“Content =”{\“file \”:[\“没有文件   提交。\ “]}”

为了实现这一点,我在标题中有一个X-Software-Company密钥,提供了一个有效的xml文件,我使用表单数据(multipart / form-data)和我的身份验证凭据发送。

预期解决方案:

我想让Restsharp方法工作,为什么它现在不起作用。 所以我提供的Restsharp方法需要和我提供的httpclient方法一样。

我尝试了什么:

Restsharp方法: ==>这是问题

  public void TestUpload()
    {
        byte[] fileBytes = File.ReadAllBytes(@"C:\temp\test.xml");

        var client = new RestClient("url for the rest call");

        var request = new RestRequest(Method.POST);
        request.AlwaysMultipartFormData = true;

        request.Credentials = new NetworkCredential("username", "password");

        request.AddHeader("X-Software-Company", "software key");
        request.AddHeader("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
        request.AddFile("file", @"C:\temp\test.xml");
        //request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
        //request.AddParameter("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"file\"; filename=\"C:\\temp\\test.xml\"\r\nContent-Type: false\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--", ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);
    }

HttpClient方法: ==>它工作正常

public void TestUploadHttpClient()
    {
        byte[] fileBytes = File.ReadAllBytes(@"C:\temp\test.xml");

        using (HttpClient httpClient = new HttpClient())
        {
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "credentials");
            httpClient.DefaultRequestHeaders.Add("X-Software-Company", "software key");
            using (var content = new MultipartFormDataContent("boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"))
            {
                content.Add(new StreamContent(new MemoryStream(fileBytes)), "file", "test.xml");

                using (var message = httpClient.PostAsync("url for the rest call", content).Result)
                {
                    var input = message.Content.ReadAsStringAsync().Result;
                }
            }
        }
    }

邮差生成的代码:

如果我通过Postman提出请求没有问题,如果我检查邮递员生成的Restsharp代码,它会给我:

var client = new RestClient("url for the rest call");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Basic credentials");
request.AddHeader("Content-Type", "multipart/form-data");
request.AddHeader("X-Software-Company", "software key");
request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
request.AddParameter("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"file\"; filename=\"C:\\temp\\test.xml\"\r\nContent-Type: false\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);

我确实完成了邮递员生成的测试代码,但它不起作用。

编辑2018-03-19:

RestSharp中可能存在的问题:Added files not being recieved #1079

临时解决方案:

我正在使用RestSharp版本v105.2.3然后它就像一个魅力。

有谁知道为什么restsharp方法不起作用以及如何解决?

1 个答案:

答案 0 :(得分:0)

尝试将内容类型参数放在AddFile方法中,如下所示:

request.AddFile("file", @"C:\temp\test.xml", "application/octet-stream");