@Chad: So more like this....
public class output_if_mime_output : behavior_base_for_convenience
{
public override OUTPUT AfterInvocation<OUTPUT>(OUTPUT output,
IInvocationResult insideResult)
{
Result = output is IMimeOutput ? new RenderMimeResult
((IMimeOutput)output) : insideResult;
return output;
}
}
public interface IMimeOutput
{
byte[] Content { get; }
string MimeType { get; }
string FileName { get; }
}
public class MimeOutput : IMimeOutput
{
readonly string mimeType;
readonly byte[] content;
readonly string fileName;
public MimeOutput(string mimeType, string fileName, byte[]
content)
{
this.mimeType = mimeType;
this.content = content;
this.fileName = fileName;
}
public byte[] Content
{
get { return content; }
}
public string MimeType
{
get { return mimeType; }
}
public string FileName
{
get { return fileName; }
}
}
public class RenderMimeResult : IInvocationResult
{
readonly IMimeOutput mimeOutput;
public RenderMimeResult(IMimeOutput mimeOutput)
{
this.mimeOutput = mimeOutput;
}
public void Execute(IServiceLocator locator)
{
var writer = locator.GetInstance<IMimeOutputWriter>();
writer.Write(mimeOutput);
}
}
public interface IMimeOutputWriter
{
void Write(IMimeOutput mimeOutput);
}
public class HttpResponseMimeOutputWriter : IMimeOutputWriter
{
public void Write(IMimeOutput mimeOutput)
{
var response = HttpContext.Current.Response;
response.ContentType = mimeOutput.MimeType;
response.AddHeader("Content-Disposition", string.Format
("Filename={0}", mimeOutput.FileName));
response.Buffer = true;
response.BinaryWrite(mimeOutput.Content);
}
}