API に HttpResponseMessage を返すメソッドがあります。
[HttpGet, HoodPeekAuthFilter]
public HttpResponseMessage GlobalOverview()
{
try
{
StatsRepo _statsRepo = new StatsRepo();
string file = _statsRepo.IncidentData().AsCSVString();
if (file == null)
{
return Request.CreateResponse(HttpStatusCode.NoContent);
}
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StringContent(file);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = "GlobalOverview.csv";
return result;
}
catch (Exception ex)
{
return Request.CreateResponse(HttpStatusCode.InternalServerError);
}
}
私の MVC Web アプリケーションには、API を呼び出してファイルを返す必要があるコントローラー アクションがあります。
[Authorize]
[HttpGet]
public HttpResponseMessage GlobalOverview()
{
HttpResponseMessage file = new HttpResponseMessage();
using (HttpClient httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(this.UserName + ':' + this.Password)));
Task<HttpResponseMessage> response = httpClient.GetAsync("api.someDomain/Reporting/GlobalOverview");
file = response.Result;
}
return file;
}
API URL に直接アクセスすると、ユーザー名とパスワードの入力を求められ、[ファイルの保存] ダイアログが表示され、ファイルをダウンロードできます。
Web アプリケーションのアクションに移動すると、次の応答出力が画面に表示されます。
StatusCode: 200,
ReasonPhrase: 'OK',
Version: 1.1,
Content: System.Net.Http.StreamContent,
Headers: { Pragma: no-cache X-SourceFiles: = XXXXXXX
Content-Disposition: attachment;
filename=GlobalOverview.csv
Content-Type: application/octet-stream Expires: -1
FileResult を返す必要があると思いますが、HttpResponseMessage を FileResult に変換する方法がわかりません。