Amazon S3 pass-through controller
I don't understand the point in using this pattern:

    catch (WebException ex)
    {
        var state = (RequestState)result.AsyncState;

        if (state.Response != null)
            state.Response.Close();

        AsyncManager.Parameters["webException"] = ex;
    }
    catch (Exception ex)
    {
        var state = (RequestState)result.AsyncState;

        if (state.Response != null)
            state.Response.Close();

        throw;
    }
    finally
    {
        AsyncManager.Parameters["key"] = "key";
        AsyncManager.OutstandingOperations.Decrement();
    }


When it looks like it could be simplified to this:

    catch (WebException ex)
    {
        AsyncManager.Parameters["webException"] = ex;
    }
    finally
    {
        var state = (RequestState)result.AsyncState;

        if (state.Response != null)
            state.Response.Close();

        AsyncManager.Parameters["key"] = "key";
        AsyncManager.OutstandingOperations.Decrement();
    }


The following may stem from my lack of familiarity with Amazon S3:

I'm not sure what functionality your ReadFully method offers over Stream.Read(Stream.Length) or, more safely, Stream.Read(Stream.Length - Stream.Position) except potentially causing issues if the stream does not have a length of multiplies of 16x1024.

Speaking of which, you've hard-coded that 16x1024 in a magic number: 

var buffer = new byte[16 * 1024];

I would recommend converting these values to consts so you can change them later with ease.