D.C. (9-10-3, 30 points) earned its first win against Philadelphia since April 1, 2017, going 0-9-1 in their previous 10 meetings.
The Union (8-6-8, 32 points) lost for the second time in their past four games and are winless on the road in eight straight (0-4-4). It's the first time they've lost consecutive road matches since dropping three straight from September 2019 to February 2020.
D.C. was in control from the get-go.
United thought they had the opening tally in the 13th minute on a Gressel feed to Antonio Alfaro but Gressel was ruled offside.
Two minutes later, Union goalkeeper Andre Blake denied the home side of the first goal with a diving save to the right on a Gressel attempt. Blake followed it up with a short side save along the post on Andy Najar.
Philadelphia took a 1-0 lead on a favorable bounce in the 22nd minute when Alejandro Bedoya's cross deflected off D.C. defender Steven Birnbaum and into the net.
Blake kept his team on top with another diving save, this time to the left, on Reyna.
D.C. went ahead 2-1 in the 50th minute. Blake made the initial save on Kamara's header off a Gressel cross and Reyna knocked in the rebound.
Ramon Abila sealed it with a shot from the right side of the goalmouth in the fifth minute of second-half stoppage time to make it 3-1.