问题:如何使用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方法不起作用以及如何解决?
答案 0 :(得分:0)
尝试将内容类型参数放在AddFile方法中,如下所示:
request.AddFile("file", @"C:\temp\test.xml", "application/octet-stream");