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

  • 相关阅读:
    【JAVA】日志管理slf4j
    【JAVA】从java线程来看java内存模型
    【数据结构】---栈和队列
    【数据结构】---链表
    C++ 第10章 反省程序与C++标准模板库
    回忆C++知识点(1)
    C++ 第8章 多态性
    C++ 第7章 继承与派生
    C++ 第6章 数组、指针、字符串
    C++ 第5章 数据的共享与保护
  • 原文地址:https://www.cnblogs.com/Jiaojiawang/p/4818792.html
Copyright © 2020-2023  润新知