이전 소 개 를 통 해 우 리 는 페이지 대상 을 실행 하 는 방법 을 알 고 있 습 니 다.핵심 은 반사 입 니 다.요청 에서 파 라 메 터 를 얻 고 지정 한 방법 을 실행 하 는 과정 입 니 다.실제로 이것 은 asp.net 뮤 직 비디오 프레임 워 크 의 핵심 사상 과 유사 합 니 다.url 을 분석 하여 contrller 와 action 이름 을 가 져 온 다음 에 contrller 대상 을 활성화 시 켜 action 파 라 메 터 를 요청 하고 action 을 집 니 다.웹 form 플랫폼 에서 우 리 는 방법 을.aspx.cs 에 적 었 습 니 다.실현 하고 자 하 는 것 은 페이지 대상 이 생 성 되 지 않 은 상황 에서 지정 한 방법 을 실행 한 다음 에 결 과 를 되 돌려 주 는 것 입 니 다. 우 리 는 먼저 실현 후의 몇 가지 호출 예 를 보고 이런 기능 도 조합 해서 사용 할 수 있다.
[AjaxMethod]
public void Test1(int index)
{
//
}
[AjaxMethod]
public string Test2(Test test)
{
return " Test ";
}
[AjaxMethod(OutputCache = 20)]
public string Test3(int index)
{
return " 20 ";
}
[AjaxMethod(ServerCache = 20)]
public string Test4()
{
return " 20 ";
}
[AjaxMethod(SessionState=SessionState.None)]
public void Test5()
{
//Session
}
[AjaxMethod(SessionState = SessionState.ReadOnly)]
public void Test6()
{
//Session
}
[AjaxMethod(SessionState = SessionState.ReadWrite)]
public void Test7()
{
//Session
}
[AjaxMethod(IsAsync = true)]
public void Test8()
{
//
}
앞에서 우 리 는 이미 기본 적 인 집행 절 차 를 잘 알 고 있 으 며,지금 은 바로 주제 에 들어간다. 아 약 스 약속 일반적으로 현재 주류 브 라 우 저 는 ajax 를 사용 하여 비동기 요청 을 보 낼 때 요청 헤더 에 X-Requested-With:XML HttpRequest 라 는 표 시 를 가 져 옵 니 다.이 표 시 를 통 해 ajax 요청 인지 아 닌 지 를 직접 판단 할 수 있 습 니 다.그러나 프로젝트 에 다른 구성 요소 가 있 을 수 있 습 니 다.서로 영향 을 주지 않 기 위해 사용자 정의 요청 헤드 를 추가 합 니 다.여 기 는:
internal static class AjaxConfig
{
/// <summary>
/// Ajax
/// </summary>
public const string Key = "AjaxFlag";
/// <summary>
/// Ajax
/// </summary>
public const string Value = "XHR";
/// <summary>
/// Ajax
/// </summary>
public const string MethodName = "";
}
http 의 요청 헤더 에 Ajax Flag:XHR 가 포함 되 어 있다 면 우리 가 처리 해 야 한 다 는 뜻 입 니 다.또한 http header 의 MethodName 은 우리 가 실행 할 방법의 이름 을 표시 합 니 다. AjaxMethodAttribute 태그 속성 태그 속성 은 반사 용 입 니 다.여기 서 우리 가 필요 로 하 는 기능 을 정의 합 니 다.우 리 는 있 기 를 바란다. 1.세 션 상 태 를 설정 할 수 있 습 니 다. 2.비동기 핸들 러 지원 3.캐 시 받 기 지원 4.서버 캐 시 지원 다음 과 같이 정의 합 니 다.Attributeusag 로 이 표 시 는 방법 에 만 사용 할 수 있 습 니 다.
/// <summary>
/// ajax
/// </summary>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class AjaxMethodAttribute : Attribute
{
public AjaxMethodAttribute()
{
}
private SessionState _sessionState = SessionState.None;
private int _outputCache = 0;
private int _serverCache = 0;
private ContentType _contentType = ContentType.Plain;
private bool _isUseAsync = false;
/// <summary>
/// session
/// </summary>
public SessionState SessionState
{
get { return _sessionState; }
set { _sessionState = value; }
}
/// <summary>
/// , 。 get
/// </summary>
public int OutputCache
{
get { return _outputCache; }
set { _outputCache = value; }
}
/// <summary>
/// ,
/// </summary>
public int ServerCache
{
get { return _serverCache; }
set { _serverCache = value; }
}
/// <summary>
/// ( text/plain)
/// </summary>
public ContentType ContentType
{
get { return _contentType; }
set { _contentType = value; }
}
/// <summary>
///
/// </summary>
public bool IsAsync
{
get { return _isUseAsync; }
set { _isUseAsync = value; }
}
}
/// <summary>
/// Session
/// </summary>
public enum SessionState
{
None,
ReadOnly,
ReadWrite
}
/// <summary>
///
/// </summary>
public enum ContentType
{
Plain,
Html,
XML,
Javascript,
JSON
}
각종 처리 프로그램 과 Ajax Handler Factory 전편 에 따 르 면 구체 적 인 Handler 는 주로 두 가지 로 나 뉘 는데 비동기 와 비 비동기 이다.이 두 가지 유형 에서 Session 의 상태 에 대해 서 는 세 가지 가 있 습 니 다.지원 하지 않 고 읽 기 만 지원 합 니 다(IReadOnly Session State 인터페이스 실현).읽 기 쓰기 지원(IRequiresSession State 인터페이스 실현).IReadOnly Session State 와 IRequiresSession State 는 모두 인터페이스 만 표시 합 니 다(아무런 방법 이 없 으 며,사실은 태그 속성 으로 합 리 적 으로 이 루어 져 야 합 니 다).비동기 적 인 Handler 는 IHttpAsyncHandler 인 터 페 이 스 를 실현 해 야 하 며,이 인 터 페 이 스 는 IHttpHandler 를 실현 했다.Handler 의 ProcessRequest 방법(또는 BeginProcessRequest)은 우리 가 실행 해 야 할 방법 입 니 다.정 의 는 다음 과 같 습 니 다. 비동기 상태 가 아 닌 Handler:
// Session
internal class ASyncAjaxHandler : IHttpAsyncHandler, IHttpHandler
{
private Page _page;
private CacheMethodInfo _cacheMethodInfo;
internal ASyncAjaxHandler(Page page, CacheMethodInfo cacheMethodInfo)
{
_page = page;
_cacheMethodInfo = cacheMethodInfo;
}
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
// ( )
Action<Page, HttpContext, CacheMethodInfo> action = new Action<Page, HttpContext, CacheMethodInfo>(Executor.Execute);
IAsyncResult result = action.BeginInvoke(_page, context, _cacheMethodInfo, cb, action);
return result;
}
public void EndProcessRequest(IAsyncResult result)
{
Action<Page, HttpContext, CacheMethodInfo> action = result.AsyncState as Action<Page, HttpContext, CacheMethodInfo>;
action.EndInvoke(result);
}
public void ProcessRequest(HttpContext context)
{
throw new NotImplementedException();
}
public bool IsReusable
{
get { return false; }
}
public static ASyncAjaxHandler CreateHandler(Page page, CacheMethodInfo cacheMethodInfo, SessionState state)
{
switch (state)
{
case SessionState.ReadOnly:
return new ASyncAjaxSessionReadOnlyHandler(page, cacheMethodInfo);
case SessionState.ReadWrite:
return new ASyncAjaxSessionHandler(page, cacheMethodInfo);
default:
return new ASyncAjaxHandler(page, cacheMethodInfo);
}
}
}
// Session
internal class ASyncAjaxSessionReadOnlyHandler : ASyncAjaxHandler, IReadOnlySessionState
{
internal ASyncAjaxSessionReadOnlyHandler(Page page, CacheMethodInfo cacheMethodInfo)
: base(page, cacheMethodInfo)
{
}
}
// Session
internal class ASyncAjaxSessionHandler : ASyncAjaxHandler, IRequiresSessionState
{
internal ASyncAjaxSessionHandler(Page page, CacheMethodInfo cacheMethodInfo)
: base(page, cacheMethodInfo)
{
}
}
Ajax Handler Factory 는 요청 에 따라 구체 적 인 Handler 를 생 성 하 는 IHandler Factory 인 터 페 이 스 를 실현 하 였 으 며,웹.config 에 등록 하여 사용 해 야 합 니 다.Ajax Handler Factory 의 GetHandler 는 우리 가 요청 을 차단 하 는 첫걸음 이다.요청 헤더 의 AjaxFlag:XHR 를 통 해 우리 가 처리 해 야 할 지 여 부 를 판단 합 니 다.만약 그렇다면 Handler 를 만 듭 니 다.그렇지 않 으 면 일반적인 방식 으로 진행 합 니 다.우리 의 방법 은.aspx.cs 에 쓰 여 있 기 때문에 우리 의 요청 은.aspx 접미사,즉 페이지(Page,IHttpHandler)형식 입 니 다.Page 는 PageHandler Factory 를 통 해 만 들 어 졌 고 PageHandler Factory 도 IHandler Factory 인 터 페 이 스 를 실현 하여 처리 프로그램 을 만 드 는 데 사용 되 었 음 을 표시 합 니 다.그래서 우 리 는 PageHandler Factory 로 IHttpHandler 를 만들어 야 합 니 다.그러나 PageHandler Factory 의 구조 함 수 는 proctected internal 형식 입 니 다.우 리 는 직접 new 를 만 들 수 없 기 때문에 CommonPageHandler Factory 를 통 해 이 를 계승 해 야 합 니 다. PageHandler Factory 를 통 해 Page 를 획득 한 후 방법 명 을 결합 하면 Ajax MethodAttribute 태그 속성 을 반사 적 으로 얻 을 수 있 습 니 다.그리고 그 속성 에 따라 구체 적 인 Handler 를 생 성 합 니 다.구체 적 인 코드 는 다음 과 같다.
위의 CacheMethodInfo 는 캐 시 호출 방법 에 관 한 정보 입 니 다.첫 번 째 편 에서 캐 시 최적화 방법 에 대해 언급 한 적 이 있 습 니 다.캐 시+의뢰 를 포함 합 니 다.그러나 캐 시 방법의 MethodInfo 는 직접 캐 시 하지 않 습 니 다.캐 시 MethodInfo 는 Invoke 를 통 해 실행 해 야 하기 때문에 효율 이 낮 습 니 다.여기 서 제 가 캐 시 한 것 은 방법의 의뢰 입 니 다.이 의뢰 의 서명 은 Func
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다: