一度記すNET HttpHandlerインタフェース性能最適化プロセス(続き)
第1章概要
前回の記事で「.NET HttpHandlerインタフェースのパフォーマンス最適化プロセスを記述する」で同じクライアントの同時要求問題が解決された後も、IHttpHandlerインタフェースは同期モードであり、非同期モードに変更し、ログインインタフェースとビジネスインタフェースを分解し、IRequiresSessionStateとIreadOnlySessionStateをそれぞれ実現する必要があり、効率が向上しました.ここでは2つの問題を考える必要があります.1つ目の問題は互換性です.インタフェースの修正には互換性の問題を考慮する必要があります.元のインタフェースは変更しないことをお勧めします.2つ目の問題は,フロントエンドコードを変更せずにインタフェースメソッドの再構築を行う方法を考えることである.インタフェースの完璧なアップグレードを目的としています.
第2章具体手順
2.1工場クラスの構築
Handlerファクトリクラスを確立し、IHttpHandlerFactoryインタフェースを実現し、GetHandlerメソッド内でログインインタフェースとビジネスインタフェースを区別し、このEatsunMobileServiceHandlerファクトリクラスを新しいインタフェースのインタフェースのインタフェースとする.public class EatsunMobileServiceHandler : IHttpHandlerFactory
{
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
//......
// Handler
if (action == "LOGIN")
{
//
return new EatsunMobileNewLoginHandler(param);
}
return new EatsunMobileNewHandler(param);
}
public void ReleaseHandler(IHttpHandler handler)
{
}
}
2.2 Handlerへのログインの実装
EatsunMobileNewLoginHandlerクラスを新規作成し、IHttpHandlerとIRequiresSessionStateを実装します.IRequiresSessionStateを実装するのは、既存のログインロジック自体がSessionを読み書きする必要があるためです.同じクライアントでは、ログイン・ビジネス自体に複数のリクエストが同時にアクセスされない場合があります.public class EatsunMobileNewLoginHandler : IHttpHandler, IRequiresSessionState
{
public bool IsReusable
{
get { return false; }
}
public EatsunMobileNewLoginHandler(JSONObject param)
{
_param = param;
}
public void ProcessRequest(HttpContext context)
{
// , Session
Request(context);
}
}
2.3業務の実現Handler
新規非同期ベースクラスの継承:HttpAsyncHandlerpublic class EatsunMobileNewHandler : HttpAsyncHandler
{
private JSONObject _param { get; set; }
public EatsunMobileNewHandler(JSONObject param)
{
_param = param;
}
public bool IsReusable
{
get
{
return false;
}
}
public override void BeginProcess(HttpContext context)
{
//
Request(context);
EndProcess();
}
}
HttpAsyncHandlerベースクラスはIHttpAsyncHandler、IAsyncResult非同期インタフェース、IreadOnlySessionState読取り専用sessionインタフェースを実現し、ビジネスロジックはsessionを読み取るだけであるため、これは末端IreadOnlySessionStateだけであり、同じクライアントの同時要求の場合より良い性能表現が得られている.public abstract class HttpAsyncHandler : IHttpAsyncHandler, IAsyncResult, IReadOnlySessionState
{
private bool _completed;
private Object _state;
private AsyncCallback _callback;
private HttpContext _context;
public object AsyncState
{
get { return _state; }
}
public WaitHandle AsyncWaitHandle
{
get { throw new NotImplementedException(); }
}
public bool CompletedSynchronously
{
get { return false; }
}
public bool IsCompleted
{
get { return _completed; }
}
public bool IsReusable
{
get { return false; }
}
public abstract void BeginProcess(HttpContext context);
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
_callback = cb;
_context = context;
_completed = false;
_state = this;
ThreadPool.QueueUserWorkItem(new WaitCallback(DoProcess), this);
return this;
}
public void EndProcessRequest(IAsyncResult result)
{
}
public void EndProcess()
{
if (!_completed)
{
try
{
_completed = true;
if (_callback != null)
_callback(this);
}
catch (Exception) { }
}
}
private static void DoProcess(object state)
{
HttpAsyncHandler handler = (HttpAsyncHandler)state;
handler.BeginProcess(handler._context);
}
public void ProcessRequest(HttpContext context)
{
//row new NotImplementedException();
}
}
第3章まとめ
本章の内容は従来のIHttpHandlerインタフェースの実現方法の再構築に対して、IHttpAsyncHandler非同期方式を採用して再実現する.セッションを書く必要のないビジネスインタフェースメソッドを分割し、IreadOnlySessionStateインタフェースを実現し、同じクライアントの同時要求のより良いパフォーマンスを達成しました.
2.1工場クラスの構築
Handlerファクトリクラスを確立し、IHttpHandlerFactoryインタフェースを実現し、GetHandlerメソッド内でログインインタフェースとビジネスインタフェースを区別し、このEatsunMobileServiceHandlerファクトリクラスを新しいインタフェースのインタフェースのインタフェースとする.
public class EatsunMobileServiceHandler : IHttpHandlerFactory
{
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
//......
// Handler
if (action == "LOGIN")
{
//
return new EatsunMobileNewLoginHandler(param);
}
return new EatsunMobileNewHandler(param);
}
public void ReleaseHandler(IHttpHandler handler)
{
}
}
2.2 Handlerへのログインの実装
EatsunMobileNewLoginHandlerクラスを新規作成し、IHttpHandlerとIRequiresSessionStateを実装します.IRequiresSessionStateを実装するのは、既存のログインロジック自体がSessionを読み書きする必要があるためです.同じクライアントでは、ログイン・ビジネス自体に複数のリクエストが同時にアクセスされない場合があります.
public class EatsunMobileNewLoginHandler : IHttpHandler, IRequiresSessionState
{
public bool IsReusable
{
get { return false; }
}
public EatsunMobileNewLoginHandler(JSONObject param)
{
_param = param;
}
public void ProcessRequest(HttpContext context)
{
// , Session
Request(context);
}
}
2.3業務の実現Handler
新規非同期ベースクラスの継承:HttpAsyncHandler
public class EatsunMobileNewHandler : HttpAsyncHandler
{
private JSONObject _param { get; set; }
public EatsunMobileNewHandler(JSONObject param)
{
_param = param;
}
public bool IsReusable
{
get
{
return false;
}
}
public override void BeginProcess(HttpContext context)
{
//
Request(context);
EndProcess();
}
}
HttpAsyncHandlerベースクラスはIHttpAsyncHandler、IAsyncResult非同期インタフェース、IreadOnlySessionState読取り専用sessionインタフェースを実現し、ビジネスロジックはsessionを読み取るだけであるため、これは末端IreadOnlySessionStateだけであり、同じクライアントの同時要求の場合より良い性能表現が得られている.
public abstract class HttpAsyncHandler : IHttpAsyncHandler, IAsyncResult, IReadOnlySessionState
{
private bool _completed;
private Object _state;
private AsyncCallback _callback;
private HttpContext _context;
public object AsyncState
{
get { return _state; }
}
public WaitHandle AsyncWaitHandle
{
get { throw new NotImplementedException(); }
}
public bool CompletedSynchronously
{
get { return false; }
}
public bool IsCompleted
{
get { return _completed; }
}
public bool IsReusable
{
get { return false; }
}
public abstract void BeginProcess(HttpContext context);
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
_callback = cb;
_context = context;
_completed = false;
_state = this;
ThreadPool.QueueUserWorkItem(new WaitCallback(DoProcess), this);
return this;
}
public void EndProcessRequest(IAsyncResult result)
{
}
public void EndProcess()
{
if (!_completed)
{
try
{
_completed = true;
if (_callback != null)
_callback(this);
}
catch (Exception) { }
}
}
private static void DoProcess(object state)
{
HttpAsyncHandler handler = (HttpAsyncHandler)state;
handler.BeginProcess(handler._context);
}
public void ProcessRequest(HttpContext context)
{
//row new NotImplementedException();
}
}