The hosts took the lead through a third-minute Mark Noble penalty that was awarded by referee Mark Clattenburg for Ryan Bennett’s negligible pull on Winston Reid.
They doubled their lead 23 minutes later through Joey O’Brien’s opportunist close-range strike, despite the fact that Norwich’s Alexander Tettey was grounded in the build-up with a head injury.
Russell Martin handed Norwich last-gasp hope with an injury-time consolation, but they couldn’t force an equaliser and have now lost their last four league games.
The result sees Sam Allardyce’s side leapfrog Norwich into 11th place, with Chris Hughton’s out-of-form team now 12th.
The hosts were given a perfect start by Clattenburg, whose decision to penalise Bennett for tussling with Reid allowed Noble to send Mark Bunn the wrong way with a well-struck right-foot shot.
Although they then took control of the game, they were lucky to stay ahead when, after a rare foray forward, Norwich’s Robert Snodgrass struck the foot of the post with a sublime free-kick from 25 yards.
The visitors then had another refereeing decision go against them when a penalty appeal was waved away, despite a clear handball in the West Ham box from Reid.
And they then fell 2-0 behind, once again in controversial circumstances. With Tettey down on the floor, Sebastien Bassong failed to fully clear Noble’s near-post cross and O’Brien sidefooted home the rebound.
The goal sapped Norwich’s confidence and West Ham took complete control of the game, with only Mark Bunn keeping the score at 2-0 courtesy of fine saves from Matt Taylor and Jack Collison.
However, the visitors improved markedly after the break and both teams created numerous half-chances as the tempo increased and the game opened up.
Substitute Elliott Bennett delivered a superb cross for Martin to sweep home at the near post in injury time, but West Ham held on for a deserved and much-needed victory.