更改WebRequest的Method属性(C#)

时间:2013-12-01 01:16:11

标签: c# methods properties ftp invalidoperationexception

上传文件后是否有更好的方法来更改WebRequests的Method属性?

我的方式如下:

WebRequest request = WebRequest.Create("ftp://.../...txt");
request.Credentials = new NetworkCredential("...", "...");
request.Method = WebRequestMethods.Ftp.UploadFile;

// Then I write to the request stream with StreamWriter

// Try reading
request.Method = WebRequestMethods.Ftp.DownloadFile;
    // If I only change the Method property, the next line throws an InvalidOperationException

StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream(), true);

1 个答案:

答案 0 :(得分:3)

WebRequest.Create创建的对象只能使用一次,因此您需要创建一个新对象以发送另一个请求。

var someLocation = "ftp://.../...txt";
WebRequest request = WebRequest.Create(someLocation);
request.Credentials = new NetworkCredential("...", "...");
request.Method = WebRequestMethods.Ftp.UploadFile;
// Then I write to the request stream with StreamWriter

// Create new request with the same parameters:
WebRequest request = WebRequest.Create(someLocation);
request.Credentials = new NetworkCredential("...", "...");
request.Method = WebRequestMethods.Ftp.DownloadFile;
using(StreamReader reader = 
   new StreamReader(request.GetResponse().GetResponseStream(), true))...

请注意,每个请求都包含其他一次性对象,例如请求流和响应流(两者都是NetworkStream,并且不支持搜索)。如果允许重用WebRequest.Create创建的请求,则需要重置所有相关对象,这与创建新对象基本相同,但缺点是隐式更改Method(或Url,或者标题或几乎任何其他属性对象)。 .Net类的设计更喜欢隐式的显式操作。您会发现像FileStream这样的已处置对象等其他示例无法神奇地恢复到原始状态并更改文件位置属性。