1

ユーザーが完全な長さの 192Kb/s MP3 オーディオ ファイルをダウンロードできるようにするクライアント アプリケーションがあります。ファイルはビジネスとして外部に保存されるため、次のことができる必要があります。

1) ファイルを外部の場所からローカル サーバー キャッシュにコピーします。

2)そのファイルを要求したクライアントにコピーします

明らかに、同じファイルに対するそれ以降のリクエストはキャッシュから送信され、外部に送信する必要はありません。

現在、(Squid Cache を使用して) これを行う現在のシステムが既にありますが、問題は、1 が完全に完了してから 2 しか実行されないことです。これは、10 分の 192kb/s トラックが外部の場所からキャッシュにコピーされるのに 75 秒かかる場合、クライアントの HTTP タイムアウトが約 60 秒で始まることを意味します! これは私たちの要件を満たしていません。

私たちが必要としているのは、外部の場所からデータを取得している間にクライアントに転送できるキャッシュであると思われます。そして私の質問は次のとおりです。

1) これは Squid Cache で実行できますか (これは従来の現職者であり、私の選択ではありません)。

2) そうでない場合、この種のシナリオに最も適しているテクノロジはどれですか (コストは実際には問題ではありません)。

これが何らかの形で明確でない場合はお知らせください!

4

1 に答える 1

1

これは、別のサーバーからいくつかのものをプロキシするためにしばらく前に書いたasp.netハンドラーです。ファイルに書き込み、そのファイルを 2 回目に使用するのはそれほど難しくありません。ループ内で応答をフラッシュすると、ダウンロード中に配信されます。

namespace bla.com
{
    /// <summary>
    /// Summary description for $codebehindclassname$
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Proxy : IHttpHandler
    {
        private static Regex urlRegex=new Regex(@"http://some_regex_here_to_prevent_abuse_of_proxy.mp3",RegexOptions.Compiled);
        public void ProcessRequest(HttpContext context)
        {
            var targetUrl = context.Request.QueryString["url"];
            MatchCollection matches = urlRegex.Matches(targetUrl);

            if (matches.Count != 1 || matches[0].Value != targetUrl)
            {
                context.Response.StatusCode = 403;
                context.Response.ContentType = "text/plain";
                context.Response.Write("Forbidden");
                return;
            }

            HttpWebRequest req = (HttpWebRequest) WebRequest.Create(targetUrl);
            Stream responseStream;
            using (HttpWebResponse response = (HttpWebResponse)req.GetResponse())
            {
                responseStream = response.GetResponseStream();
                context.Response.ContentType = response.ContentType;

                byte[] buffer = new byte[4096];
                int amt;
                while ((amt = responseStream.Read(buffer, 0, 4096))>0)
                {

                    context.Response.OutputStream.Write(buffer, 0, amt);
                    Debug.WriteLine(amt);
                } 
                responseStream.Close();
                response.Close();
            }
            context.Response.Flush();
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
于 2009-04-10T12:21:12.190 に答える