私たちは外部レストAPI(Vimeo)を使用して、電話からサーバーにビデオをアップロードしています。この操作を実行する手順の1つは、アップロードされたバイト数を確認することです。これを行うには、要求をPUTヘッダに特定のURLに対して実行する必要があります。
- 認証ベアラd4559ba ...
- APIからのContent-レンジバイト*/*無効なHttpStatusCode
応答のいずれかである:
- 200 OK - 不完全308再開 - - アップロードが
を完了した場合にアップロードされたバイト数をRangeヘッダ(例えばレンジバイト= 0-1000)を与える情報を
問題がenum HttpStatusCode(https://developer.xamarin.com/api/type/System.Net.HttpStatusCode/)Xamarinでは含まれていないということです値308および結果client.PutAsyncへの呼び出し中に例外がスローされる: {System.Net.WebException:無効なステータスコード:308 ---> System.Net.ProtocolViolationException:無効なステータスコード:308 at System.Net.HttpWebRequest.Redirect ..}
このエラーを回避するにはどうすればよいですか?ここでは、使用しているC#のコードは次のとおりです。
var client = new HttpClient(new NativeMessageHandler() { AutomaticDecompression = DecompressionMethods.Deflate });
var uri = new Uri(url);
client.DefaultRequestHeaders.Add("Authorization", string.Format("Bearer {0}", Constants.VimeoToken));
var stringContent = new StringContent("");
stringContent.Headers.Add("Content-Range", "bytes */*");
var httpResponse = await client.PutAsync(uri, stringContent);
return httpResponse;
編集: 私はこのコードでDelegatingHandlerを使用してみました:
public class MyDelegatingHandler : DelegatingHandler
{
public MyDelegatingHandler(HttpMessageHandler innerHandler) : base(innerHandler) { }
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);
if (!response.IsSuccessStatusCode && response.StatusCode == (HttpStatusCode)308) //This line of code is never reached
{
}
return response;
}
}
var client = new HttpClient(new MyDelegatingHandler(new NativeMessageHandler() { AutomaticDecompression = DecompressionMethods.Deflate }));
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Put, url);
var stringContent = new StringContent("");
stringContent.Headers.Add("Content-Range", "bytes */*");
message.Content = stringContent;
CancellationToken cancellationToken = new CancellationToken();
var response = await client.SendAsync(message, cancellationToken);
問題は、if文base.SendAsyncは例外とコードの次の行を(スローです)に達していない。 Delegatingハンドラを別の方法で使うべきですか?
編集:
RestClient client = new RestClient(url);
var request = new RestRequest("", Method.PUT);
request.AddHeader("Authorization", string.Format("Bearer {0}", Constants.VimeoToken));
request.AddHeader("Content-Range", "bytes */*");
var response = await client.Execute(request);
正しく作成されていない要求を意味し、私は間違ったステータスコードを受け取り、この要求に:私はこのコードでRestSharpを使用してみました。 Content-Rangeヘッダが正しく追加されておらず、Vimeoサーバがそれを読み取ることができない可能性があります。このヘッダーを追加する別の方法はありますか?
ブローアップせずに308ステータスコードを処理するために 'DelegatingHandler'を作成し、それをクライアントと一緒に使用してください。 – Nkosi
どのネイティブ' NativeMessageHandler'を使用していますか?私はHttpClientの実装として 'HttpClient'とネイティブ' NSUrlSession'または 'AndroidClientHandler'を使用して308sで問題はありません... – SushiHangover
NativeMessageHandlerは、Android上でOkHttpを使用しているModernHttpClientの一部であり、NSURLSessionまたはiOS上のAFNetworkingです。メッセージハンドラを変更しても、308を含まないHttpStatusCodeが使用されます。 – Uros