问题:如何通过 Restsharp 使用 multipart/form-data 上传 XML 文件?
Problem:
我使用 Peppol 通过 Codabox API 发送发票。
我想将 xml 上传到其余服务。
其余服务本身由提供商 Codabox 控制。
我提供了两种方法,我希望他们能做同样的事情。
首先,使用 Postman 和 httpclient,一切工作正常。
我想从使用 Restsharp 方式的 httpclient 方法中获得相同的结果。
RestSharp版本:106.2.1
Restsharp 的错误消息
响应=“状态代码:BadRequest,内容类型:application/json,
内容长度:-1)" 内容 = "{\"文件\":[\"没有文件
已提交。\"]}"
为了实现这一点,我在标头中有一个 X-Software-Company 密钥,提供使用表单数据(多部分/表单数据)和我的身份验证凭据发送的有效 xml 文件。
预期解决方案:
我想让 Restsharp 方法发挥作用,以及为什么它现在不起作用。
所以我提供的Restsharp方法需要和我提供的httpclient方法做同样的事情。
我尝试过的:
休息方法:==> 这是问题所在
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;
}
}
}
}
邮递员生成的代码:
如果我通过邮递员执行请求,那么没有问题,如果我检查邮递员生成的 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 中可能存在的问题:添加的文件未收到#1079 https://github.com/restsharp/RestSharp/issues/1079
临时解决方案:
我正在使用 RestSharp 版本 v105.2.3 然后它就像一个魅力。
有谁知道为什么 RestSharp 方法不起作用以及如何解决这个问题?