2010-06-25 2 views
1

타사 공급 업체와 통합 될 전자 상거래 사이트에서 작업하기 - 해당 공급 업체가 내부적으로 사용하는 상점 (즉, 상점 ABC123은 Google의 001-321 임)과 다른 식별자를 사용합니다. 내가 요청을 나타냅니다 예약 된 쿼리 문자열 매개 변수에 대한 들어오는 요청을 검사하는 가장 좋은 방법을 연구하고 있습니다 자신의 식별자를 사용하여 다시 우리의 식별자 식별자를 매핑한다ASP.NET WebForms - 사이트의 모든 페이지에서 특수한 쿼리 문자열 매개 변수 처리 - URL 다시 쓰기, URL 라우팅 또는 다른 방법?

는 (그래서 요청 example.com/ & 경우 theirId = ABC123 요청을 example.com/ & ourId = 001-321로 변환하고 싶습니다.

이 매핑을 수행하려면 제공된 ID를 검사하고 데이터베이스 또는 캐시에 대한 조회를 실행 한 다음 요청을 지정된 페이지로 전달해야합니다. 쿼리 문자열 매개 변수 만 수정하면됩니다 (다른 매개 변수는 HTTPHeader 등의 세부 사항과 같이 유지해야한다.

지금까지 내가 연구하고있어 몇 가지 다른 접근 방법 :

  • (이미 너무 많은 않지만, 우리의 로깅 인프라의 이익과 다른 주입 종속성이있는) 기본 페이지에 구현
  • 은 (라우팅과 같은 URL 라우팅은 당신이 아직도 생각하면 통찰력을 제공 자유롭게, 원하는 것이 아니다 사용
  • 재 작성 URL을 사용하여 IHttpModule
  • 에 구현

성능 비용은 고려)에 맞는 :이 변환이 발생합니다 실제 횟수가 그것을 필요로하는 요청 하지의 수에 비해 매우 작을 것이다 - 아마도 1 %.

그러나 우리는 거의 모든 요청이 매핑을 수행 할 또 다른 통합 사이트 - 다른 접근 방식은 이전부터이 시나리오에 더 적합 것입니까?

+0

IIS의 버전? – ScottE

+0

은 IIS 7.5에서 호스팅되며 3.5 SP1을 실행합니다. – STW

답변

1

이것은 모든 요청에서 URL 처리에 뛰어 들고 싶다면 HTTP 모듈이 가장 적합한 전형적인 경우입니다. 퍼프 오버 헤드를 사용하면 일을 올바르게 단락시킬 수 있고 필요없는 곳에서 DB/캐시 조회를하지 않아도된다는 많은 문제가 없어야합니다.

구성 방식에 따라 구성을 배포하고 관리하는 문제를 이미 해결해야하므로 다른 사용자 지정 모듈이 많은 오버 헤드를 추가하는지 의심 스럽습니다.

일반적으로 상속에 비해 컴포지션을 선호하는 편이 낫습니다. 필요에 따라 모듈을 추가하거나 제거 할 수 있지만 코드가 비대해진 기본 페이지 클래스에 정적으로 포함되면 더 많은 문제가 발생할 수 있습니다.

0

나는 aspx 페이지의 기본 페이지 클래스와 비슷한 것을 구현했지만, 모듈이 잘 작동한다고 언급 했으므로. 필자의 의견으로는이 기능이 모든 페이지에서 필요하다면 다른 http 모듈을 유지 관리하는 것이 웹 config/iis에 매핑되어야하기 때문에 기본 클래스를 작성해야합니다. URL 재 작성은 CPU 집약적이며 필요한 유연성을 제공하지 못할 수 있습니다. 다시 또 다른 구성/iss 종속성을 추가합니다. 난 당신이 캐싱의 일종을 구현하는 한 이들 중 하나가 많은 오버 헤드가 발생할 것으로 생각하지 않습니다.

희망 하시겠습니까?

즐기십시오!

0

저는 대개 사이트의 요청 컨텍스트를 유지하기 위해 Singleton 클래스를 만들고이를 HttpContext.Current.Items()에 저장합니다. Application_BeginRequest 루틴에서이 클래스를 초기화합니다.

Imports System.Web 

공공 클래스 SiteContext

Private _viewId As Int32 
Private _tab As String 
Private _action As String 

Private Sub New() 
    _viewId = -1 
    _tab = String.Empty 
    _action = String.Empty 

    FillContext() 
End Sub 

Public Shared Function Instance() As SiteContext 
' gets the site specific context for the current request 

    If HttpContext.Current.Items("RequestContext") Is Nothing Then 
     HttpContext.Current.Items("RequestContext") = New SiteContext 
    End If 
    Return HttpContext.Current.Items("RequestContext") 

End Function 

' fill the request context with site specific items 
Private Sub FillContext() 

    ' iterate through all items passes via the querystring and save values to matching key property names 
    For i As Int16 = 0 To _context.Request.QueryString.Count - 1 
     Dim qryItem As String = _context.Request.QueryString.Keys.Item(i) 

     Select Case qryItem 
      Case "v", "view", "viewid", "vid" ' VIEW ID 
       If IsNumeric(_context.Request.QueryString(qryItem)) AndAlso CType(_context.Request.QueryString(qryItem), Double) < 10000 Then 
        _viewId = CType(_context.Request.QueryString(qryItem), Int32) 
       End If 

      Case "tab" ' TAB ID; secondary parameter to choose sub view 
       _tab = _context.Request.QueryString(qryItem) 

      Case "action" ' ACTION ID; tertiary parameter to choose sub-sub view 
       _action = _context.Request.QueryString(qryItem) 

      Case Else 

     End Select 
    Next 

End Sub 

Public Property ViewId() As Int32 
    Get 
     Return _viewId 
    End Get 
    Set(ByVal Value As Int32) 
     If Value < 1 Then 
      Value = 1 
     End If 
     _viewId = Value 
    End Set 
End Property 

Public Property Tab() As String 
    Get 
     Return _tab 
    End Get 
    Set(ByVal Value As String) 
     _tab = Value.Trim 
    End Set 
End Property 

Public Property Action() As String 
    Get 
     Return _action 
    End Get 
    Set(ByVal Value As String) 
     _action = Value.Trim 
    End Set 
End Property 

최종 클래스