一些背景. 目前有一个asp.net网站,它包含在2个负载均衡的Web服务器上,即Web场.
我想有一些代码可以让我调用一个特定的服务器并在其上执行一个方法.我想这样做,以便我可以强制所有Web服务器通过网站上的网页刷新缓存.
用例是:管理员用户登录到站点并对已缓存的设置进行更改,然后单击"刷新Web服务器缓存"按钮,然后在每个服务器上调用更新缓存方法.这是为了防止每次更改缓存设置时都必须重新启动应用程序池.
杰米克的回答是正确的; 每台机器仍然有自己的IP.我使用ASHX处理程序来接收重置缓存的请求.Web场中的任何计算机都可以发起请求.
这是一个相当完整的示例,但是我没有包含一些辅助方法和配置设置.
这是在每个执行缓存重置的站点上实际调用处理程序的代码.我建议在机器之间使用某种共享密码,并单独保护处理程序,以便不能公开访问它.
////// Calls for a reset of caches on one or more user sites serving reports. /// Allows for multiple urls to be processed; configure the reset targets /// using AppSettings["UserCacheResetUrl"], delimited with pipes if there /// are multiple sites. /// public static void ClearAllUserCaches() { // // clear local user caches ClearUserCaches(); // // clear out of process user caches string[] urls = AppSettings.UserServers; for( int i = 0; i < urls.Length; i++ ) { string url = urls[i] + AppSettings.UserCacheResetPath + "&sharedPassword=" + AppSettings.SharedPassword; WebRequest request = null; HttpWebResponse response = null; try { request = WebRequest.Create( url ); response = (HttpWebResponse)request.GetResponse(); } catch( WebException ex ) { Log.LogException( ex ); } finally { request = null; } if( response == null || response.StatusCode != HttpStatusCode.OK ) { if( response != null ) { response.Close(); response = null; } } } }
处理程序代码本身(抱歉长度).
////// Exposes an interface for trusted callers to request that this /// instance of the application perform an action. /// public class AdministrationRequestHandler : IHttpHandler { ////// Processes an incoming request and performs an action specified via the "action" /// parameter passed on the query string. Only local callers will be allowed, and /// only callers who pass a shared password via the "sharedPassword" query string /// parameter. /// /// public void ProcessRequest( HttpContext context ) { // // get the action from the query string, and check that // it actually contains a value. string action = context.Request.QueryString["action"].ToSafeString().ToUpper( CultureInfo.InvariantCulture ); if( string.IsNullOrEmpty( action ) ) { // // Dump out an error message and return--we can't do anything // without an action and this request may have malicious // origins. context.Response.Write( "Missing action." ); return; } // // Now validate the shared password that all web applications in this // solution should be using. This password will NEVER be placed on a user's // query string or ever passed over a public network. string sharedPassword = context.Request.QueryString["sharedPassword"].ToSafeString(); if( string.IsNullOrEmpty( sharedPassword ) ) { context.Response.Write( "Missing shared password." ); return; } // // check that the shared password is actually valid if( sharedPassword != AppSettings.SharedPassword ) { context.Response.Write( "Invalid shared password." ); return; } // // perform the specified action if( action == "CLEAR_CACHE" ) { AppContext.ClearUserCaches(); } } ////// Specifies whether or not the instance is reusable. /// public bool IsReusable { get { return false; } } }