Hello Eric,
Sorry for delay, we did some test on this, and notice if you call your exportMap after the map rendered, the export map is fine, but if you call your exportMap in the control initialize method, it will has problem.
I think the reason is map still rendering, and in this time, the extent will be the extent you set, but after map rendered, map will snapped to the default one zoomscale, so that the extent will be different, so this make the export image looks different with map display image.
Map display in brower
Saved map before snapped:
Saved map after snapped:
You can try debug and get the Map.CurrentExtent after map rendered, and set this value in your initialize extent and compare the result.
If this is the root cause, there are two ways to reslove this, one is call the openlayer save to bitmap method in the OnMapCreated function in client side, another is also in this function but raise a Ajax call and call server side save map.
Regards,
Gary