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

Posted

技术标签:

【中文标题】为啥这个 Web API 方法会触发两次?【英文标题】:Why is this Web API method firing twice?为什么这个 Web API 方法会触发两次? 【发布时间】:2013-06-01 17:28:24 【问题描述】:

我正在尝试使用 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;

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

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

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

我的所有其他操作都运行良好。我是否错过了客户端的某些内容,例如接受标头或其他内容?我现在只是在做一个简单的 GET。

谢谢!

【问题讨论】:

如果我理解该方法并创建一个 OK 响应并返回它,它返回就好了。我有一个使用块的实体框架和一个使用块的 FileStream。我将开始提取代码,看看是否可以隔离问题。 【参考方案1】:

找到了! 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) ;

【讨论】:

顺便说一句,您不需要明确设置 ContentLength 标头。 StreamContent 为您设置内容长度标头。 StreamContent 检查提供的流,看它是否可以寻找流,然后尝试获取流的长度。 我无法从你的回答中确切看出你做了什么不同?我正在处理一个类似的问题,即 FireFox 每个请求调用该操作两次。任何其他信息将不胜感激。 是的,我没有包含整个方法。对于那个很抱歉。发生的事情是我在 SteamContent 对象的流中使用了“使用”块。因此,在请求正确完成之前,流就被关闭并处理掉了。我不知道为什么该方法似乎触发了两次,但跳过流上的 using 块为我解决了这个问题。 @DougDawson 您应该编辑您的答案以包含完整方法(指出 using 语句已删除),因此像我这样的传入用户不必深入研究 cmets 以找出此答案有效的原因为你。 :)

以上是关于为啥这个 Web API 方法会触发两次?的主要内容,如果未能解决你的问题,请参考以下文章

为啥单击功能会在 Angular 2 中为自定义组件触发两次

为啥我的 Xcode 机器人会触发两次?

为啥新连接的观察者会触发两次 LiveData 观察者

为啥刷新浏览器时 Application_BeginRequest() 会触发两次?

android 转屏触发了两次onConfigurationChanged()方法,很诡异,不知道有人遇到过吗?

为啥 Blazor 生命周期方法会执行两次?