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来处理了。

  • 相关阅读:
    【2012】笔试面试总结(二)
    sdf数据文件查看小工具
    excel表格中怎样使个别单元格变成只读
    平时收获,供需及取(PPC)
    GDI+ 绘制统计图(2D、3D)
    Com注册
    Pocket PC 录音
    我有自己的"CodeSnippet"了!
    打包Winows Mobile快捷方式中文问题?
    ORA12154: TNS: 无法解析指定的连接标识符问题解决
  • 原文地址:https://www.cnblogs.com/Jiaojiawang/p/4818792.html
Copyright © 2011-2022 走看看