包含内容的多部分内容

时间:2018-08-08 18:11:40

标签: c# .net refit

我在Refit中使用了multipart。我尝试上传个人资料图片以进行服务 邮递员生成的代码看起来像这样

var client = new RestClient("http://api.example.com/api/users/1");
var request = new RestRequest(Method.POST);
request.AddHeader("Postman-Token", "xxx");
request.AddHeader("Cache-Control", "no-cache");
request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
request.AddParameter("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"_method\"\r\n\r\nput\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"profile_picture\"; filename=\"ic_default_avatar.png\"\r\nContent-Type: image/png\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);

然后我像这样构造Refit方法

[Multipart]
[Post("/users/{id}")]
IObservable<BaseResponse<User>> UpdateProfilePicture(int id,[AliasAs("profile_picture")] byte[] profilePicture,[AliasAs("_method")]string method="put");

如果我使用byte[]ByteArrayPart,它将抛出异常

  

{System.Net.Http.HttpRequestException:发送时发生错误   请求---> System.Net.WebException:获取响应时出错   流(分块读取2):ReceiveFailure ---> System.Exception:在   System.Net.WebConnection.HandleError(System.Net.WebExceptionStatus   st,System.Exception e,System.String其中)[0x00031]在   :0处   System.Net.WebConnection.Read(System.Net.HttpWebRequest请求,   System.Byte []缓冲区,System.Int32偏移量,System.Int32大小)   [0x000d2] in:0 at   System.Net.WebConnectionStream.ReadAll()[0x0010e]在   :0处   System.Net.HttpWebResponse.ReadAll()[0x00011]在   :0处   System.Net.HttpWebRequest.CheckFinalStatus(System.Net.WebAsyncResult   结果)[0x001d6]在:0处   System.Net.HttpWebRequest.SetResponseData   (System.Net.WebConnectionData数据)[0x0013e]在   :0处   System.Net.WebConnection.ReadDone(System.IAsyncResult结果)   [0x0024d] in:0 at   System.Net.Sockets.SocketAsyncResult + <> c.b__27_0   (系统对象状态)在[0x00000]中   :0处   System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem   ()[0x00015] in:0 at   System.Threading.ThreadPoolWorkQueue.Dispatch()[0x00074]在   :0处   ObjCRuntime.Runtime.ThreadPoolDispatcher(System.Func`1 [TResult]   回调)[0x00006]在<0b60c1467e7449608ac42f9c7bbfdd05>:0中   System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()   [0x00009] in:0 at   System.Net.WebConnection.HandleError(System.Net.WebExceptionStatus   st,System.Exception e,System.String其中)[0x00031]在   /Library/Frameworks/Xamarin.iOS.framework/Versions/11.12.0.4/src/Xamarin.iOS/mcs/class/System/System.Net/WebConnection.cs:439

。并且如果我使用StreamStreamPart,也会抛出异常,表示流已关闭。

2 个答案:

答案 0 :(得分:7)

您可以使用IEnumerable<StreamPart>上传文件:

  [Multipart]
  [Post("/users/{id}")]
  Task UpdateProfilePicture(int id, [AliasAs("profile_picture")] IEnumerable<StreamPart> streams);

答案 1 :(得分:2)

这是一个古老的问题,但也许可以帮助其他人。

由于服务器端收到的文件大小始终为0,所以我也无法使用StreamPart,所以我使用ByteArrayPart而不是这里的github.com/reactiveui/refit#multipart-uploads

接口:

[Multipart]
[Post("/api/<some-path>")]
Task<HttpResponseMessage> Upload([AliasAs("file")] ByteArrayPart bytes);

用法:

var stream;
using (MemoryStream ms = new MemoryStream())
{
    stream.CopyTo(ms);
    client.Upload(new ByteArrayPart(ms.ToArray(), fileName));
}
  

请注意,此技术会将整个流加载到内存中!     它对我有用,因为我的文件很小,但是如果要处理大文件或内存使用是一个问题,则应该找到一种更好的方法。