And they held on to end Fulham's four-match winning run despite Aboubakar Kamara reducing the arrears late on in a frantic and bad-tempered finale of penalty appeals and near-misses.
Fulham's first serious attack came after nine minutes. Stefan Johansen spotted the run of Ivan Cavaleiro and chipped the ball over the City defence and into his path, but goalkeeper Daniel Bentley was swiftly off his line to get enough of a touch on Cavaleiro's shot to allow Jack Hunt to clear.
Six minutes later the visitors should have taken the lead. A lucky bounce fell for Andreas Weimann and he spread the ball out to Niclas Eliasson on the right. His cross was met by Diedhiou six yards out but his header was straight at goalkeeper Marek Rodak, who clutched the ball at the second attempt.
But after 26 minutes they were ahead. Fulham probably thought they had cleared an initial attack but Eliasson, on the left this time, collected the loose ball and returned it into the centre, where Brownhill headed his fifth goal of the campaign firmly past Rodak from eight yards.
Fulham tried to hit back but were too ponderous with their attacks. Even when a clever feint by Cavaleiro left two defenders on their backs, he took too long to decide what to do next and the chance was gone.
They looked sharper after the interval and Anthony Knockaert scampered clear of the City defence only for Bentley to block his shot with his legs.
But City doubled their lead after 76 minutes with a superbly-worked team goal. Brownhill's clever back-heel released Adam Nagy, who slid the ball across goal for Diedhiou to tap in his sixth goal of the season in all competitions.
Fulham pulled one back four minutes from time thanks to two substitutes. Bentley parried a shot be Neeskens Kebano but Kamara hit home the rebound.
And there was still time for Kebano to head against the crossbar as the Robins held on.