继续篇中的
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来处理了。
浙公网安备 33010602011771号