处理 File.Open 或 StreamContent
Dispose of File.Open or StreamContent
content.Add
的下一行是否会使对象无法正确处理?如果是这样,正确的处理方法是什么。
public string UploadGameToWebsite(string filename, string url, string method = null)
{
var client = new HttpClient();
var content = new MultipartFormDataContent();
content.Add(new StreamContent(File.Open(filename, FileMode.Open, FileAccess.Read)), "Game", "Game.txt");
var task = client.PutAsync(url, content);
var result = task.Result.ToString();
return result;
}
是的,会的。 File.Open returns 应该处理的流。最简单的方法是使用 "using" 块,如下所示:
public string UploadGameToWebsite(string filename, string url, string method = null)
{
var client = new HttpClient();
var content = new MultipartFormDataContent();
using (var fileStream = File.Open(filename, FileMode.Open, FileAccess.Read))
{
content.Add(new StreamContent(fileStream), "Game", "Game.txt");
var task = client.PutAsync(url, content);
var result = task.Result.ToString();
return result;
}
}
- 如果要在方法中调用异步操作,请将方法设为异步。
- 配置你的文件流和客户端。在下面的例子中,通过处理
StreamContent
它也处理了底层的 FileStream
.
- 我更喜欢使用 finally 块来处理多个一次性对象,嵌套
using
语句也非常好。
- 不确定你为什么 return 在
HttpResponseMessage
上输入 ToString
,也许状态代码会更有用,或者查看 StatusCode = 200 和 return 布尔值(true/false)?
代码:
public async Task<string> UploadGameToWebsiteAsync(string filename, string url, string method = null)
{
HttpClient client = null;
StreamContent fileStream = null;
try
{
client = new HttpClient();
fileStream = new StreamContent(System.IO.File.Open(filename, FileMode.Open, FileAccess.Read))
var content = new MultipartFormDataContent();
content.Add(fileStream, "Game", "Game.txt");
HttpResponseMessage result = await client.PutAsync(url, content);
return result.ToString();
}
finally
{
// c# 6 syntax
client?.Dispose();
fileStream?.Dispose(); // StreamContent also disposes the underlying file stream
}
}
代码版本 #2 使用 using
个块。
public async Task<string> UploadGameToWebsiteAsync(string filename, string url, string method = null)
{
using (var client = new HttpClient())
{
using (var fileStream = new StreamContent(System.IO.File.Open(filename, FileMode.Open, FileAccess.Read)))
{
var content = new MultipartFormDataContent();
content.Add(fileStream, "Game", "Game.txt");
HttpResponseMessage result = await client.PutAsync(url, content);
return result.ToString();
}
}
}
content.Add
的下一行是否会使对象无法正确处理?如果是这样,正确的处理方法是什么。
public string UploadGameToWebsite(string filename, string url, string method = null)
{
var client = new HttpClient();
var content = new MultipartFormDataContent();
content.Add(new StreamContent(File.Open(filename, FileMode.Open, FileAccess.Read)), "Game", "Game.txt");
var task = client.PutAsync(url, content);
var result = task.Result.ToString();
return result;
}
是的,会的。 File.Open returns 应该处理的流。最简单的方法是使用 "using" 块,如下所示:
public string UploadGameToWebsite(string filename, string url, string method = null)
{
var client = new HttpClient();
var content = new MultipartFormDataContent();
using (var fileStream = File.Open(filename, FileMode.Open, FileAccess.Read))
{
content.Add(new StreamContent(fileStream), "Game", "Game.txt");
var task = client.PutAsync(url, content);
var result = task.Result.ToString();
return result;
}
}
- 如果要在方法中调用异步操作,请将方法设为异步。
- 配置你的文件流和客户端。在下面的例子中,通过处理
StreamContent
它也处理了底层的FileStream
. - 我更喜欢使用 finally 块来处理多个一次性对象,嵌套
using
语句也非常好。 - 不确定你为什么 return 在
HttpResponseMessage
上输入ToString
,也许状态代码会更有用,或者查看 StatusCode = 200 和 return 布尔值(true/false)?
代码:
public async Task<string> UploadGameToWebsiteAsync(string filename, string url, string method = null)
{
HttpClient client = null;
StreamContent fileStream = null;
try
{
client = new HttpClient();
fileStream = new StreamContent(System.IO.File.Open(filename, FileMode.Open, FileAccess.Read))
var content = new MultipartFormDataContent();
content.Add(fileStream, "Game", "Game.txt");
HttpResponseMessage result = await client.PutAsync(url, content);
return result.ToString();
}
finally
{
// c# 6 syntax
client?.Dispose();
fileStream?.Dispose(); // StreamContent also disposes the underlying file stream
}
}
代码版本 #2 使用 using
个块。
public async Task<string> UploadGameToWebsiteAsync(string filename, string url, string method = null)
{
using (var client = new HttpClient())
{
using (var fileStream = new StreamContent(System.IO.File.Open(filename, FileMode.Open, FileAccess.Read)))
{
var content = new MultipartFormDataContent();
content.Add(fileStream, "Game", "Game.txt");
HttpResponseMessage result = await client.PutAsync(url, content);
return result.ToString();
}
}
}