维护Web响应中的文件名

Tim*_*gen 1 c#

我有一个名为grabFile的Web服务,当我调用它时,它获取文件的路径和文件名,并将其作为a返回给我Stream.Web服务通过添加content-Disposition标头来设置文件名.当通过我的服务提出请求时,我会收到回复并将其返回.问题是直接调用grabFile网络服务(如放置在我的Web请求下面直接进入我的浏览器地址栏看到的地址)的文件下载,文件有正确的文件名.但是,当我从我的程序调用Web服务并传递流时,它会下载文件但是使用默认文件名.当我从应用程序返回响应头时,是否只传递响应头?

private Stream GetFileStream(string fileName)
{
    string requestId = Guid.NewGuid().ToString().ToUpper();
    string uriTemplate = String.Format("https://www.example.org/grabfile/grabfile.svc/file/myapp/?q={0}&rid={1}",fileName,requestId);
    Uri uri = new Uri(uriTemplate);
    WebRequest webRequest = WebRequest.Create(uri);
    WebResponse webResponse = webRequest.GetResponse();

    return webResponse.GetResponseStream();

}
Run Code Online (Sandbox Code Playgroud)

tpe*_*zek 8

GetResponseStream()方法返回仅包含响应主体的流.您可以使用该Headers属性来获取Content-Disposition标头值,然后解析它:

string fileName = webResponse.Headers["Content-Disposition"].Replace("attachment; filename=", String.Empty).Replace("\"", String.Empty);
Run Code Online (Sandbox Code Playgroud)

(您可能需要将替换调整为标头值)

因此,您可以创建一个实体来保存您的请求结果,例如:

public class ResponseFileInfo
{
    public string Name { get; private set; }

    public Stream Content { get; private set; }

    public ResponseFileInfo(string name, Stream content)
    {
        Name = name;
        Content = content;
    }
}
Run Code Online (Sandbox Code Playgroud)

并有一个这样的方法:

private ResponseFileInfo GetFile(string fileName)
{
    string requestId = Guid.NewGuid().ToString().ToUpper();
    string uriTemplate = String.Format("https://www.myDomain.com/grabfile/grabfile.svc/file/myapp/?q={0}&rid={1}&sid={2}",fileName,requestId,this.sid);

    MemoryStream fileContent = null;
    string fileName = String.Empty;

    Uri uri = new Uri(uriTemplate);
    using (WebRequest webRequest = WebRequest.Create(uri))
    {
        using (WebResponse webResponse = webRequest.GetResponse())
        {
            fileName = webResponse.Headers["Content-Disposition"].Replace("attachment; filename=", String.Empty).Replace("\"", String.Empty);

            fileContent = new MemoryStream();
            Stream responseStream = webResponse.GetResponseStream();
            byte[] responseBuffer = new byte[16*1024];
            int responseBytesRead;

            while((responseBytesRead = responseStream.Read(responseBuffer, 0, responseBuffer.Length) > 0)
                fileContent.Write(responseBuffer, 0, responseBytesRead);
        }
    }

    return new ResponseFileInfo(fileName, fileContent);
}
Run Code Online (Sandbox Code Playgroud)

您还需要记住调用.Dispose()ResponseFileInfo.Content,当你完成(我会考虑实施IDisposableResponseFileInfo,并在其包装using块).