我也要求我跟蹤的流媒體文件下載的進度提出了類似要求。我做到了,大致是這樣的:
服務器端:
服務:
public object Get(FooRequest request)
{
var stream = ...//some Stream
return new StreamedResult(stream);
}
StreamedResult類:
public class StreamedResult : IHasOptions, IStreamWriter
{
public IDictionary<string, string> Options { get; private set; }
Stream _responseStream;
public StreamedResult(Stream responseStream)
{
_responseStream = responseStream;
long length = -1;
try { length = _responseStream.Length; }
catch (NotSupportedException) { }
Options = new Dictionary<string, string>
{
{"Content-Type", "application/octet-stream"},
{ "X-Api-Length", length.ToString() }
};
}
public void WriteTo(Stream responseStream)
{
if (_responseStream == null)
return;
using (_responseStream)
{
_responseStream.WriteTo(responseStream);
responseStream.Flush();
}
}
}
客戶端:
string path = Path.GetTempFileName();//in reality, wrap this in try... so as not to leave hanging tmp files
var response = client.Get<HttpWebResponse>("/foo/bar");
long length;
if (!long.TryParse(response.GetResponseHeader("X-Api-Length"), out length))
length = -1;
using (var fs = System.IO.File.OpenWrite(path))
fs.CopyFrom(response.GetResponseStream(), new CopyFromArguments(new ProgressChange((x, y) => { Console.WriteLine(">> {0} {1}".Fmt(x, y)); }), TimeSpan.FromMilliseconds(100), length));
的「的copyfrom」擴展方法是直接從該項目這裏的源代碼文件「StreamHelper.cs」借:Copy a Stream with Progress Reporting(榮譽給恩寧Dieterichs)
和榮譽給mythz任何貢獻者ServiceStack。偉大的項目!
感謝mythz,我發現了WebRequest擴展,同時調查了loannis的答案,並開始懷疑需要標準的WebRequest而不是ServiceClient。我已經成功地使用了DownloadAsString,但在您的示例中將切換到DownloadUrl,這要歸功於它提供的Headers的訪問權限。再次感謝您確認WebRequest應該用於文件下載,我發現了很多用於提供文件的服務代碼,但卻試圖找到使用該服務的示例:) – thudbutt
+1:好,簡單,實用。 –
我沒有意識到這個功能,那簡直是無摩擦的驚人! –