为什么这个Web API方法会触发两次?

Dou*_*son 6 asp.net-web-api

我正在尝试使用Web API服务.我正在尝试通过GET请求进行文件下载.这个方法发射得很好并且达到了我的突破点.我创建一个响应并返回它.然后,奇怪的是,断点再次命中.我正在使用Firefox附加海报来测试它.海报说服务器没有回应.知道为什么会这样吗?

这是响应创建代码:

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;
Run Code Online (Sandbox Code Playgroud)

唯一重要的变化(我能想到的)是我的WebApiConfig,如下所示:

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

我的方法签名如下所示:public HttpResponseMessage GetUpdate(int Id)

我所有的其他行动都很好.我是否在客户端丢失了某些内容,比如接受标题或其他内容?我现在正在做一个简单的GET.

谢谢!

Dou*_*son 5

找到了!使用声明似乎是麻烦.在结果发送之前,可能正在处理流.我更新了我的代码,它开始工作:

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) };
Run Code Online (Sandbox Code Playgroud)

  • @DougDawson,您应该编辑您的答案以包含完整的方法(指出 using 语句已删除),这样像我这样的传入用户就不必深入评论来找出为什么这个答案对您有用。:) (2认同)