RouteData
우선 RouteData 가 언제 어떻게 사용 되 는 지 살 펴 보 자.
public virtual void PostResolveRequestCache(HttpContextBase context)
{
RouteData routeData = this.RouteCollection.GetRouteData(context);
if (routeData != null)
{
IRouteHandler routeHandler = routeData.RouteHandler;
if (routeHandler == null)
{
throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, RoutingResources.UrlRoutingModule_NoRouteHandler, new object[0]));
}
if (!(routeHandler is StopRoutingHandler))
{
RequestContext requestContext = new RequestContext(context, routeData);
IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
if (httpHandler == null)
{
throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, RoutingResources.UrlRoutingModule_NoHttpHandler, new object[] { routeHandler.GetType() }));
}
context.Items[_requestDataKey] = new RequestData { OriginalPath = context.Request.Path, HttpHandler = httpHandler };
context.RewritePath("~/UrlRouting.axd");
}
}
} 여기에서 볼 수 있 듯 이 RouteData 는 RouteCollection.GetRouteData 방법 으로 HttpContextBase 상하 문 에서 해석 된다.
RouteData 에 RouteHandler 를 설치 하 는 것 외 에 Route 규칙 에 따라 url 을 분석 한 후에 얻 은 key-vaule 쌍:예 를 들 어 controller,action 등
그리고 HttpContextBase 와 함께 RequestContext 에 봉인 합 니 다.IHttpHandler 에 게 맡 깁 니 다.
http Handler 와 Request.Path 를 RequestData 에 봉 하여 HttpContextBase 에 넣 습 니 다.그 구성 은 다음 과 같다.
다음은 RouteCollection 에서 RouteData 를 얻 는 방법 이다.Collection 의 모든 Route 를 옮 겨 다 니 며 첫 번 째 규칙 에 맞 는 RouteData 를 되 돌려 줍 니 다.
1: public RouteData GetRouteData(HttpContextBase httpContext) 2: { 3: if (httpContext == null) 4: { 5: throw new ArgumentNullException("httpContext"); 6: } 7: if (httpContext.Request == null) 8: { 9: throw new ArgumentException(RoutingResources.RouteTable_ContextMissingRequest, "httpContext"); 10: } 11: if (!this.RouteExistingFiles) 12: { 13: string appRelativeCurrentExecutionFilePath = httpContext.Request.AppRelativeCurrentExecutionFilePath; 14: if (((appRelativeCurrentExecutionFilePath != "~/") && (this._vpp != null)) && (this._vpp.FileExists(appRelativeCurrentExecutionFilePath) || this._vpp.DirectoryExists(appRelativeCurrentExecutionFilePath))) 15: { 16: return null; 17: } 18: } 19: using (this.GetReadLock())// 20: { 21: foreach (RouteBase base2 in this)// RouteBase 22: { 23: RouteData routeData = base2.GetRouteData(httpContext); // RouteBase RouteData. Class Route. 24: if (routeData != null) 25: { 26: return routeData; 27: } 28: } 29: } 30: return null; 31: } Route(RouteBase 에 계승)의 GetRouteData 구현 입 니 다.
084 public override RouteData GetRouteData (HttpContextBase httpContext) 085 { 086 var path = httpContext.Request.AppRelativeCurrentExecutionFilePath; 087 var pathInfo = httpContext.Request.PathInfo; 088 089 if (!String.IsNullOrEmpty (pathInfo)) 090 throw new NotImplementedException (); 091 092 // probably code like this causes ArgumentOutOfRangeException under .NET. 093 // It somehow allows such path that is completely equivalent to the Url. Dunno why. 094 if (Url != path && path.Substring (0, 2) != "~/" ) 095 return null ; 096 path = path.Substring (2); 097 098 var values = url.Match (path, Defaults); 099 if (values == null ) 100 return null ; 101 102 RouteValueDictionary constraints = Constraints; 103 if (constraints != null ) 104 foreach (var p in constraints) 105 if (!ProcessConstraint (httpContext, p.Value, p.Key, values, RouteDirection.IncomingRequest)) 106 return null ; 107 108 var rd = new RouteData ( this , RouteHandler); 109 RouteValueDictionary rdValues = rd.Values; 110 111 foreach (var p in values) 112 rdValues.Add (p.Key, p.Value); 113 114 RouteValueDictionary dataTokens = DataTokens; 115 if (dataTokens != null ) { 116 RouteValueDictionary rdDataTokens = rd.DataTokens; 117 foreach (var token in dataTokens) 118 rdDataTokens.Add (token.Key, token.Value); 119 } 120 121 return rd; 122 } 123 더 구체 적 인 코드 에 대해 서 는 참조 할 수 있 습 니 다.
http://www.cnblogs.com/Wind-Eagle/archive/2008/12/05/1348374.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
클린 아키텍처의 Presenter를 이해하기 어려운 것은 MVC 2가 아니기 때문에클린 아키텍처에는 구체적인 클래스 구성 예를 보여주는 다음 그림이 있습니다. 이 그림 중에서 Presenter와 Output Boundary(Presenter의 인터페이스)만 구체 구현을 이미지하는 것이 매우 어렵다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.