The Red Bull-backed driver recovered from a poor start from third on the grid to stay out of trouble and pick his way back through the field, eventually coming out on top in a head-to-head scrap for the win with wet weather specialist Nick Yelloly.
Da Costa and pole sitter Yelloly both made poor starts - the former when his anti-stall kicked in when he selected second gear, the latter due to too much wheelspin - leaving title rivals Robin Frijns and Jules Bianchi to contest the first corner.
But as the top two fought in the tricky first sector, they were both passed by a charging Andre Negrao, who shot into an early lead.
As Frijns dropped back, Bianchi hunted down Negrao, taking the lead when the Brazilian faltered at the chicane on the Mistral straight on lap eight.
However, both leaders went off a lap later just after Signes, falling behind the clutch of chasing cars and handing the lead to Yelloly.
Da Costa briefly took the lead after Yelloly slowed having cut the chicane on lap 11, but the Briton seized the place back at Turn 1. However, when the Portuguese driver went through for a second time two laps later, he would not be headed again.
Yelloly took a comfortable second place, while Daniil Move charged through the chaos behind to take third, fending off a last corner attack from Bianchi - who was recovering from a second off - in sight of the chequered flag.
Championship leader Frijns, who spent his entire race trying to defend against faster cars, eventually came home seventh.
The other contender in the championship, Sam Bird, had a quiet race from 16th on the grid. However, he did manage to salvage a point, stealing 10th place from Mikhail Aleshin on the final lap.
Results - 21 laps:
Pos Driver Team Time/Gap
1. Antonio Felix da Costa Arden Caterham 47m07.036s
2. Nick Yelloly Comtec + 1.958s
3. Daniil Move P1 + 22.690s
4. Jules Bianchi Tech 1 + 23.955s
5. Marco Sorensen Lotus + 26.742s
6. Kevin Magnussen Carlin + 28.581s
7. Robin Frijns Fortec + 34.672s
8. Nico Muller Draco + 35.170s
9. Kevin Korjus Lotus + 36.372s
10. Sam Bird ISR + 38.100s
11. Will Stevens Carlin + 41.306s
12. Mikhail Aleshin RFR + 42.693s
13. Walter Grubmuller P1 + 43.089s
14. Lucas Foresti DAMS + 44.396s
15. Carlos Huertas Fortec + 45.857s
16. Aaro Vainio RFR + 48.632s
17. Vittorio Ghirelli Comtec + 51.172s
18. Zoel Amberg Pons + 54.273s
19. Davide Rigon BVM Target + 59.214s
20. Jake Rosenzweig ISR + 1m06.359s
21. Yann Cunha Pons + 1m09.693s
22. Alexander Rossi Arden Caterham + 1m15.455s
23. Nikolay Martsenko BVM Target + 1 lap
Andre Negrao Draco 17 laps
Daniel Abt Tech 1 3 laps
Arthur Pic DAMS 0 laps
- Jules Bianchi
- Robin Frijns
- Nick Yelloly