0

/Content ディレクトリから JavaScript ファイルをユーザーに提供するときstring、そのファイルのトークンを値に置き換えて、ユーザーが特定のファイルを要求したときに、期待するすべてのカスタマイズが行われるようにします。

つまり、何らかの方法でリクエストを /Content ディレクトリにプロキシし、動的挿入を実行して、ファイルをユーザーに渡す必要があると思います。

  • この挿入をstreamメモリ内ファイルとして実行することに興味があります。おそらくメモリ効率が高いという理由だけで、ストリームを使用することをお勧めします。

ASP.NET でこのディレクトリをプロキシするにはどうすればよいですか?

私は試みました

  1. ルートを使用してコントローラーを指す

  2. URL をプロキシする WCF

しかし、それらはすべて私には「醜い」ように見えるので、この挿入/置換をプロジェクト内で可能な限り透過的にしたいと考えています。

よりクリーンな方法はありますか?

4

2 に答える 2

1

最も簡単な方法は、コントローラーでアクションを作成することです。

public class JavascriptController : Controller
{
    public ActionResult Load(string file)
    {
        var content = System.IO.File.ReadAllText(Server.MapPath(string.Format("~/Content/{0}", file)));

        //make replacements io content here

        return this.Content(content, "application/javascript");
    }
}

次に、次のように JavaScript にアクセスできます (デフォルトのルーティングがあると仮定します)。

http://localhost:53287/Javascript/Load?file=file.js

file.js は、リクエストするファイルの名前です。

URL について心配する必要はありません。必要に応じて別のルートを作成してカスタマイズできます。

于 2013-03-28T03:10:13.633 に答える
1

動的JavaScriptに関するあなたのコメントを考慮して、上に投稿した回答に対する別の回答を次に示します。

まず、mvc または wcf を使用してこれを具体的に行う方法がわかりません。これを行う方法を知っている唯一の方法は、下位レベルの HttpModule を使用することです。

次のコードを見てください。

public class JavascriptReplacementModule : IHttpModule
{
    public class ResponseFilter : MemoryStream
    {
        private Stream outputStream = null;

        public ResponseFilter(Stream output)
        {
            outputStream = output;
        }

        public override void Flush()
        {
            base.Flush();
            this.Seek(0, SeekOrigin.Begin);
            var sr = new StreamReader(this);

            string contentInBuffer = sr.ReadToEnd();

            //Do replacements here

            outputStream.Write(UTF8Encoding.UTF8.GetBytes(contentInBuffer), 0, UTF8Encoding.UTF8.GetByteCount(contentInBuffer));

            outputStream.Flush();
        }

        protected override void Dispose(bool disposing)
        {
            outputStream.Dispose();
            base.Dispose(disposing);
        }
    }

    public void Dispose() { }

    public void Init(HttpApplication context)
    {
        context.PostRequestHandlerExecute += new EventHandler(context_PostRequestHandlerExecute);
    }

    void context_PostRequestHandlerExecute(object sender, EventArgs e)
    {

        var context = (HttpApplication)sender;
        if (context.Request.Url.AbsolutePath.StartsWith("/Content") && context.Request.Url.AbsolutePath.EndsWith(".js"))
        {
            HttpContext.Current.Response.Filter = new ResponseFilter(HttpContext.Current.Response.Filter);
        }
    }
}

そして、次のようにモジュールを登録します (必ず type 属性に完全な型を入れてください):

<system.webServer>
  <modules>
    <add name="JavascriptReplacementModule" type="JavascriptReplacementModule"/>
  </modules>
</system.webServer>

これにより、クライアントに到達する前に出力ストリームを変更できます

于 2013-03-28T03:39:33.663 に答える