我正在使用多部分与改装。我尝试为我的服务上传个人资料图片 从邮递员生成的代码看起来像这样
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", "------WebKitFormBoundary7MA4YWxkTrZu0gWrnContent-Disposition: form-data; name="_method"rnrnputrn------WebKitFormBoundary7MA4YWxkTrZu0gWrnContent-Disposition: form-data; name="profile_picture"; filename="ic_default_avatar.png"rnContent-Type: image/pngrnrnrn------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:发送时出错 请求--->系统.Net.Web异常:获取响应时出错 流(分块读取 2(:接收失败 ---> 系统。异常:在 System.Net.WebConnection.HandleError (System.Net.WebExceptionStatus st, System.Exception e, System.String where( [0x00031] in :0 在 System.Net.WebConnection.Read (System.Net.HttpWebRequest request, System.Byte[] 缓冲区,System.Int32 偏移量,System.Int32 大小( [0x000d2] in :0 在 System.Net.WebConnectionStream.ReadAll (( [0x0010e] in :0 在 System.Net.HttpWebResponse.ReadAll (( [0x00011] in :0 在 System.Net.HttpWebRequest.CheckFinalStatus (System.Net.WebAsyncResult 结果( [0x001d6] in :0 在 System.Net.HttpWebRequest.SetResponseData (System.Net.WebConnectionData data([0x0013e] 在 :0 在 System.Net.WebConnection.ReadDone (System.IAsyncResult result( [0x0024d] in :0 在 System.Net.Sockets.SocketAsyncResult+<>c.b__27_0 (系统对象状态([0x00000] 在 :0 在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem (( [0x00015] 在 :0 在 System.Threading.ThreadPoolWorkQueue.Dispatch (( [0x00074] in :0 在 ObjCRuntime.Runtime.ThreadPoolDispatcher (System.Func'1[TResult] 回调( [0x00006] 在 <0B60C1467E7449608ac42f9c7bbfdd05>:0 at System.Threading._ThreadPoolWaitCallback.执行等待回调 (( [0x00009] in :0 在 System.Net.WebConnection.HandleError (System.Net.WebExceptionStatus st, System.Exception e, System.String where( [0x00031] in/Library/Frameworks/Xamarin.iOS.framework/Versions/11.12.0.4/src/Xamarin.iOS/mcs/class/System/System.Net/WebConnection.cs:439
如果我使用 Stream
或 StreamPart
它也将抛出异常,说流已关闭。
IEnumerable<StreamPart>
上传文件:
[Multipart]
[Post("/users/{id}")]
Task UpdateProfilePicture(int id, [AliasAs("profile_picture")] IEnumerable<StreamPart> streams);
这是一个古老的问题,但也许它可以帮助其他人。
我也无法使用StreamPart
,因为服务器端收到的文件大小始终为 0,所以我使用 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));
}
请注意,此技术会将整个流加载到内存中!它对我有用,因为我有小文件,但是如果您正在处理大文件或内存使用是一个问题,您应该找到更好的方法。