在我的WEB Api 2控制器中,我想从一个站点请求文件并从我的控制器返回此文件。这是代码
public HttpResponseMessage GetLecture()
{
HttpWebRequest request = WebRequest.CreateHttp("http://openmedia.yale.edu/cgi-bin/open_yale/media_downloader.cgi?file=/courses/spring11/phil181/mp3/phil181_01_011111.mp3");
request.Referer = @"http://oyc.yale.edu/courses/";
var receivedResponse = request.GetResponse();
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StreamContent(receivedResponse.GetResponseStream());
response.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(receivedResponse.ContentType);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = "phil181_01_011111.mp3";
response.Content.Headers.ContentLength = receivedResponse.ContentLength;
return response;
}
本地它工作正常,我可以下载文件但是当我将它部署到Azure时,我得到502错误。 Web服务器在充当网关或代理服务器时收到无效响应。
记录显示它在返回响应后失败,因此在方法执行期间没有异常。
这是〜50MB的文件。对于较小的文件代码工作正常。
如何使此代码在Azure上运行50 MB文件?
答案 0 :(得分:4)
首先,我会为您的Azure Web App推荐configuring remote IIS administration,因为这样可以直接访问IIS日志和相关设置。我强烈认为该问题与IIS / ASP.NET限制有关。您已经指出该方法在几秒钟内完成执行,因此这可能不是超时问题。
您还提到该代码适用于较小的文件大小,但在大小增加时失败。这指向IIS bufferingLimit,因为您的网站设置为较小的值(或者可能是默认值~4 MB)。 Here是一个描述如何将此限制增加到所需值的链接。希望这对你有用。如果没有,我建议您深入了解您网站的IIS日志。
答案 1 :(得分:0)
错误消息说明了内容,您是否尝试过其他内容类型而不是您在此处receivedResponse.ContentType
获得的内容类型?
您在之前的评论中说过,Google驱动器及以上网址会出现错误,因此它取决于返回的内容类型。
此外,您要返回流而不是整个文件,同时将ContentDisposition
指定为"attachment"
。
所以也许" audio / mpeg"将解决它或其他一些与流有效的内容类型。