如何在PCL中指定HttpWebRequest.Headers [“Range”]?

时间:2015-02-19 22:29:45

标签: httpwebrequest portable-class-library

我正在编写一个渐进式下载器作为可移植类库(Profile = 24)。它将支持以块为单位部分下载目标文件。 HttpClient不可用,我将使用HttpWebRequest,它具有部分下载的AddRange方法。但这种方法似乎不是从PCL内部获得的。所以我设置了HttpWebRequest.Headers [“Range”],但这样做会引发以下ArgumentException:

“必须使用适当的属性或方法修改'Range'标头。\ r \ nParameter name:name”

“适当的属性”似乎是HttpWebRequest.AddRange,但正如我所说,它似乎没有从PCL内部暴露出来。所以我很困惑:在PCL中指定HttpWebRequest.Headers [“Range”]的正确方法是什么?

谢谢, 西蒙

1 个答案:

答案 0 :(得分:0)

我没有找到答案,但以下界面解决方法对我有用:

我没有在便携式代码中创建HttpWebRequest,而是定义了以下自定义接口:

public interface IMyRequest {
    [...]
    void AddRange(long from, long to);
}

public interface IMyRequestFactory {
    IMyRequest Create(string url);
}

然后,在我的非可移植代码中,我创建了实现这些接口的类:

public class MyRequestImp : IMyRequest {
    private readonly HttpWebRequest request;

    public MyRequestImp (string url) {
        request = (HttpWebRequest)WebRequest.Create(url);
    }

    [...]

    public void AddRange(long from, long to) {
        request.AddRange(from, to);
    }
}

public class MyRequestFactoryImp: IMyRequestFactory {
    public IMyRequest Create(string url) {
        return new MyRequestImp(url);
    }
}

在初始化时的某个时刻,我的非可移植代码通过IMyRequestFactory接口将MyRequestFactoryImp对象传递给我的可移植库。由于HttpWebRequest是在PCL之外创建的,因此您可以访问该类的全部功能。