добавьте versionnumber к тегу compositescript asp:ScriptManager

мы пытаемся получить следующую работу сценария:

мы используем asp:scriptmanager / CompositeScripts для объединения наших сценариев в несколько блоков сценария, но после того, как каждый развертывается к системе тестирования, мы испытываем затруднения из-за тестеров, не получающих обновленные версии CSS и JavaScript (кэш браузера). Для CSS мы определили наш собственный пользовательский элемент управления CSS, который добавляет параметр Siteversion"? v=1.0.190", например, к URL CSS. Этот siteversion определяется в web.config / appsettings и ударен на каждый развертывающийся.

Мы хотели смочь использовать ту же стратегию javascripts, но к настоящему времени я не имел никакого успеха. При рендеринге тега script. рендеринг Scriptmanager

<script src="/ScriptResource.axd?d=..." type="text/javascript"></script> 

Учитывая, что настроенный siteversion тока был 1.0.190, я захочу, чтобы он представил

<script src="/ScriptResource.axd?d=...&v=1.0.190" type="text/javascript"></script> 

Как я достигаю вывод HTML "сценария" из менеджера скриптов, таким образом, я могу изменить его? Это, кажется, не присутствует в материале, представленном в Рендеринге, RenderChildren или RenderControl

Ваш Andreas

7
задан AndreasKnudsen 9 June 2010 в 13:57
поделиться

2 ответа

Я предлагаю другой подход. Chache - ваша проблема, тогда измените заголовок кеша. Вот пример, который я создаю и тестирую, и он отлично работает. На global.asax в самом начале звонка ...

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    HttpApplication app = (HttpApplication)sender;

    string cTheFile = HttpContext.Current.Request.Path;

    if (cTheFile.EndsWith("ScriptResource.axd", StringComparison.InvariantCultureIgnoreCase))
    {
        // here is the trick with your version !
        string etag = "\"" + app.Context.Request.QueryString.ToString().GetHashCode().ToString() + "1.0.190" + "\"";
        string incomingEtag = app.Request.Headers["If-None-Match"];

        app.Response.Cache.SetETag(etag);

        if (String.Compare(incomingEtag, etag) == 0)
        {
            app.Response.StatusCode = (int)System.Net.HttpStatusCode.NotModified;
            app.Response.StatusDescription = "Not Modified";                            
        }
        else
        {
            app.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(1));
            app.Response.Cache.SetMaxAge(new TimeSpan(0, 1, 0));
            app.Response.Cache.SetCacheability(HttpCacheability.Public);
        }
    }
}
1
ответ дан 7 December 2019 в 05:18
поделиться

Я немного покопался в отражателе, и похоже, что это, к сожалению, сложно добавить. MS не предоставила никаких хороших точек расширения, которые я мог бы найти. Однако, если вы хотите прибегнуть к хорошему способу отражения, добавление следующего ControlAdapter для ScriptManager должно помочь:

public class VersionedScriptManagerAdapter : ControlAdapter
{
    protected new ScriptManager Control
    {
        get { return (ScriptManager) base.Control; }
    }

    protected override void OnPreRender(System.EventArgs e)
    {
        base.OnPreRender(e);

        var compositeScriptField = Control.GetType().GetField("_compositeScript",
                                                              BindingFlags.NonPublic | BindingFlags.Instance);
        var currentCompositeScript = Control.CompositeScript;
        var versionedCompositeScript = new VersionedCompositeScriptReference();
        CopyCompositeScript(currentCompositeScript, versionedCompositeScript);
        compositeScriptField.SetValue(Control, versionedCompositeScript);
    }

    private void CopyCompositeScript(CompositeScriptReference sourceCompositeScript, CompositeScriptReference targetCompositeScript)
    {
        targetCompositeScript.Path = sourceCompositeScript.Path;
        targetCompositeScript.ResourceUICultures = sourceCompositeScript.ResourceUICultures;
        targetCompositeScript.ScriptMode = sourceCompositeScript.ScriptMode;
        foreach (var scriptReference in sourceCompositeScript.Scripts)
        {
            targetCompositeScript.Scripts.Add(scriptReference);
        }
    }

    private class VersionedCompositeScriptReference : CompositeScriptReference
    {
        protected override string GetUrl(ScriptManager scriptManager, bool zip)
        {
            string version = ConfigurationManager.AppSettings["ScriptVersion"];
            return base.GetUrl(scriptManager, zip) + "&v=" + version;
        }
    }
}

Затем, чтобы подключить этот адаптер управления, вам нужно будет создать файл Web.browser и поместить его в папке App_Browsers на сайте. Файл Web.browser должен выглядеть примерно так:

<browsers>
    <browser refID="Default">
      <controlAdapters>
        <adapter controlType="System.Web.UI.ScriptManager"
          adapterType="MyNamespace.VersionedScriptManagerAdapter">
        </adapter>
      </controlAdapters>
    </browser>
</browsers>

Я протестировал это, и у меня это сработало. Надеюсь, это поможет вам.

4
ответ дан 7 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: