c# - 处理 File.Open 或 StreamContent

标签 c# .net dispose

下面的 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;
        }

最佳答案

  1. 如果您要在您的方法中调用异步操作,请将您的方法设为异步。
  2. 配置您的文件流和客户端。在下面的示例中,通过处置 StreamContent,它还处置了底层的 FileStream
  3. 我更喜欢使用 finally block 来处理多个一次性对象,嵌套 using 语句也非常好。
  4. 不确定为什么要在 HttpResponseMessage 上返回 ToString,也许状态代码会更有用,或者查看 StatusCode = 200 并返回 bool 值(真/假) ?

代码:

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 block 。

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

关于c# - 处理 File.Open 或 StreamContent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35753081/

相关文章:

c# - 具有数据库文件相对路径的连接字符串

c# - 如何从双峰中获取每个源和目标?

c# - System.Collections.Generic.List<T>.ToArray() 和 System.Linq.Enumerable.ToArray<T>() 之间的区别?

c# - 如何使用 API 调用重现 quser.exe?

c# - (.net) CriticalFinalizerObject - 它的真正作用是什么?

c# - "using"关键字是否意味着对象已被处置并被 GC 处理?

.net - 我需要处理这个 Image 实例吗?

c# - MVC LINQ 测试存储库

c# - "where"c sharp 类声明中的关键字

.net - 存在非托管代码时避免 BadImageFormatException