无效的HttpStatusCode

时间:2017-01-24 16:00:46

标签: c# xamarin xamarin.forms vimeo-api http-status-code-308

我们正在使用外部休息API(Vimeo)将视频从手机上传到服务器。执行此操作的步骤之一是检查已上载的字节数。为此,应在具有标题的特定URL上执行PUT请求:
  - 授权持有人d4559ba ...
  - 内容范围字节* / *

API的回应是:
  - 200 Ok - 如果上传完成了   - 308 Resume Incomplete - 使用Range标头(例如Range bytes = 0-1000)给出信息已上载的字节数

问题是Xamarin中的枚举HttpStatusCode(https://developer.xamarin.com/api/type/System.Net.HttpStatusCode/)不包含值308,因此在调用client.PutAsync期间抛出异常: {System.Net.WebException:无效的状态代码:308 ---> System.Net.ProtocolViolationException:无效的状态代码:308   在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);

问题是base.SendAsync抛出异常并且未到达下一行代码(if语句)。我应该以另一种方式使用委托处理程序吗?

编辑:我尝试使用此代码使用RestSharp:

        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);

使用此请求,我收到错误的状态代码,表示请求未正确创建。可能没有正确添加Content-Range标头,Vimeo服务器无法读取它。还有另一种方法可以添加此标题吗?

2 个答案:

答案 0 :(得分:0)

您可以try - catch&#39;在PutAsync左右,检查状态代码。如果是308处理那种情况。

答案 1 :(得分:0)

如果您使用HttpWebRequest,则可以将HttpWebRequest.AllowAutoRedirect设置为false以避免此异常。我没有尝试过HttpClient.AllowAutoRedirect,但它可能有效。

如果您使用的是PCL库,则需要使用反射或依赖注入来访问该属性。