2017-01-24 12 views
0

私たちは外部レスト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サーバがそれを読み取ることができない可能性があります。このヘッダーを追加する別の方法はありますか?

+0

ブローアップせずに308ステータスコードを処理するために 'DelegatingHandler'を作成し、それをクライアントと一緒に使用してください。 – Nkosi

+0

どのネイティブ' NativeMessageHandler'を使用していますか?私はHttpClientの実装として 'HttpClient'とネイティブ' NSUrlSession'または 'AndroidClientHandler'を使用して308sで問題はありません... – SushiHangover

+0

NativeMessageHandlerは、Android上でOkHttpを使用しているModernHttpClientの一部であり、NSURLSessionまたはiOS上のAFNetworkingです。メッセージハンドラを変更しても、308を含まないHttpStatusCodeが使用されます。 – Uros

答えて

0

try - catch 'を約PutAsyncと置き、ステータスコードを調べることができます。それが308の場合はその場合を処理します。

+0

私はそれを試みましたが、その場合、アップロードされたバイト数のRangeヘッダーを含むレスポンスの読み方を知りません。 – Uros

+0

別のクライアントメカニズムを使用して実行できますか? – Moutabreath

+0

おそらくはい。あなたは何かを提案できますか? – Uros

0

HttpWebRequestを使用する場合は、この例外を回避するためにHttpWebRequest.AllowAutoRedirectをfalseに設定できます。私はHttpClient.AllowAutoRedirectを試していないが、うまくいくかもしれない。

PCLライブラリを使用している場合は、リフレクションまたは依存関係注入を使用してプロパティにアクセスする必要があります。