7

Web API サービスを試しています。GET リクエストでファイルをダウンロードしようとしています。メソッドは問題なく起動し、ブレークポイントに到達します。レスポンスを作成して返します。その後、奇妙なことに、ブレークポイントが再びヒットします。Firefox アドオンの Poster を使用してテストしています。投稿者は、サーバーからの応答がないと言っています。なぜそれが起こっているのですか?

応答作成コードは次のとおりです。

HttpResponseMessage result = this.Request.CreateResponse(HttpStatusCode.OK);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentLength = file.Length;
result.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddDays(-1));
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("Attachment") { FileName = file.Name };
return result;

唯一の重要な変更 (私が考えることができる) は、次のような WebApiConfig への変更です。

config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional });

私のメソッド署名は次のようになります: public HttpResponseMessage GetUpdate(int Id)

私の他のすべてのアクションは正常に機能しています。受け入れヘッダーなど、クライアント側で何か不足していますか? 私は今、単純なGETを行っています。

ありがとう!

4

1 に答える 1

6

それを見つけた!using ステートメントが問題のようです。結果が送信される前に、ストリームが破棄されている可能性があります。コードを次のように更新したところ、機能し始めました。

var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);

result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentLength = stream.Length;
result.Content.Headers.Expires = new DateTimeOffset(DateTime.Now.AddDays(-1));
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("Attachment") { FileName = Path.GetFileName(filePath) };
于 2013-06-05T21:35:03.770 に答える