zoukankan      html  css  js  c++  java
  • 读DataSnap源代码(四)

    继续篇中的

     1 function TCustomWebDispatcher.DispatchAction(Request: TWebRequest;
     2   Response: TWebResponse): Boolean;
     3 var
     4   I: Integer;
     5   Action, Default: TWebActionItem;
     6   Dispatch: IWebDispatch;
     7 begin
     8   FRequest := Request;
     9   FResponse := Response;
    10   I := 0;
    11   Default := nil;
    12   if Response.Sent then
    13   begin
    14     Result := True;
    15     { Note that WebSnapSvr enabled apps have no way to mark response as sent }
    16     Exit;
    17   end;
    18   Result := DoBeforeDispatch(Request, Response) or Response.Sent;
    19   while not Result and (I < FActions.Count) do
    20   begin
    21     Action := FActions[I];
    22     Result := Action.DispatchAction(Request, Response, False);
    23     if Action.Default then Default := Action;
    24     Inc(I);
    25   end;
    26   // Dispatch to self registering components
    27   I := 0;
    28   while not Result and (I < FDispatchList.Count) do
    29   begin
    30     if Supports(IInterface(FDispatchList.Items[I]), IWebDispatch, Dispatch) then
    31     begin
    32       Result := DispatchHandler(Self, Dispatch,
    33         Request, Response, False);
    34     end;
    35     Inc(I);
    36   end;
    37 
    38   if not Result and Assigned(Default) then
    39     Result := Default.DispatchAction(Request, Response, True);
    40   if Result and not Response.Sent then
    41     Result := DoAfterDispatch(Request, Response);
    42 
    43 end;

    在第26行代码之前,是执行WebModule中的Action, 然后是遍例WebModule上的Component, 只要支持IWebDispatch,都有机会处理WEB请求。

    当然就包括了   TDSHTTPWebDispatcher = class(TDSHTTPServerTransport, IWebDispatch)。 继续代码:

     1 function DispatchHandler(Sender: TObject; Dispatch: IWebDispatch; Request: TWebRequest; Response: TWebResponse;
     2   DoDefault: Boolean): Boolean;
     3 begin
     4   Result := False;
     5   if (Dispatch.Enabled and ((Dispatch.MethodType = mtAny) or
     6     (Request.MethodType = Dispatch.MethodType)) and
     7     Dispatch.Mask.Matches(string(Request.InternalPathInfo))) then
     8   begin
     9     Result := Dispatch.DispatchRequest(Sender, Request, Response);
    10   end;
    11 end;
    function TDSHTTPWebDispatcher.DispatchRequest(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse): Boolean;
    begin
      try
        if Owner is TWebModule then
          DataSnapWebModule := TWebModule(Owner);
        try
          try
            RequiresServer;
            TDSHTTPServerWebBroker(Self.FHttpServer).DispatchDataSnap(Request, Response);
            Result := True;
          except
            on E: Exception do
            begin
              { Default to 500, like web services. }
              Response.StatusCode := 500;
              Result := True;
            end;
          end;
        except
          { Swallow any unexpected exception, it will bring down some web servers }
          Result := False;
        end;
      finally
        { Reset current DataSnapWebModule }
        DataSnapWebModule := nil;
      end;
    end;
    

     至此,WEB请求转入到WebModule中的TDSHTTPWebDispatcher来处理了。

  • 相关阅读:
    产品微谈
    SVN回滚机制
    super究竟是个啥?
    PM12条
    CocoaPods初体验
    UIView局部点击
    Memory cycles about Block
    About "self"
    openfire学习(一)
    WPF菜单和布局(2)
  • 原文地址:https://www.cnblogs.com/Jiaojiawang/p/4818792.html
Copyright © 2011-2022 走看看