如何使用memorystream web api返回xlsx文件

时间:2015-08-26 16:08:18

标签: c# asp.net-web-api2 httpresponse memorystream system.net.httpwebrequest

我成功发出了一个Web请求,创建了xlsx文件并将其保存到目录中。我想流式传输它并将其返回给客户端而不实际将其保存在服务器上。

这是我目前使用的,它工作正常

  private string generateStudyTemplate(string requestId)
    {
        var serviceUrl = ConfigurationManager.AppSettings["serviceUrl"];

        // create webRequest
        HttpWebRequest webRequest = createWebRequest(serviceUrl + "/" + requestId);

        // begin async call to web request
        IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);

        // suspend this thread until call is complete. You might want to
        // do something usefull here like update your UI
        asyncResult.AsyncWaitHandle.WaitOne();

        // get the response from the completed web request
        var filename = string.Format("{0}.xlsx", "NewWorkbook");
        string physicalPath = HttpContext.Current.Server.MapPath("/FilesForExport");
        string relativePath = Path.Combine(physicalPath, filename).Replace("\\", "/");
        var filePath = relativePath;

       // var filePath = directory + "\\NewWorkbook.xlsx";
        using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
        {
            var str = webResponse.GetResponseStream();
            var inBuf = new byte[webResponse.ContentLength];
            var bytesToRead = Convert.ToInt32(inBuf.Length);
            var bytesRead = 0;
            while (bytesToRead > 0)
            {
                var n = str.Read(inBuf, bytesRead, bytesToRead);
                if (n == 0)
                    break;

                bytesRead += n;
                bytesToRead -= n;
            }

            var fstr = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
            fstr.Write(inBuf, 0, bytesRead);
            fstr.Close();
        }

        return filePath;
    }

    private static HttpWebRequest createWebRequest(string url)
    {
        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
        webRequest.ContentType = "text/xml;charset=\"utf-8\"";
        webRequest.Accept = "text/xml";
        webRequest.Method = "GET";
        return webRequest;
}

以下是我从其他一些例子中汇总的内容。

 public HttpResponseMessage GenerateMarketStudyResult([FromBody]Result id)
    {
        if (id.requestId == null)
        {
            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest));
        }
        var serviceUrl = ConfigurationManager.AppSettings["serviceUrl"];

        var streamContent = new PushStreamContent((outputStream, httpContext, transportContent) =>
        {
            try
            {
                HttpWebRequest webRequest = createWebRequest(serviceUrl + "/" + id.requestId);
                IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
                asyncResult.AsyncWaitHandle.WaitOne();

                using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
                {
                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        var str = webResponse.GetResponseStream();
                        var inBuf = new byte[webResponse.ContentLength];
                        var bytesToRead = Convert.ToInt32(inBuf.Length);
                        var bytesRead = 0;
                        while (bytesToRead > 0)
                        {
                            var n = str.Read(inBuf, bytesRead, bytesToRead);
                            if (n == 0)
                                break;

                            bytesRead += n;
                            bytesToRead -= n;
                        }
                        memoryStream.Write(inBuf, 0, bytesRead);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                outputStream.Close();
            }
        });
        streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        streamContent.Headers.ContentDisposition.FileName = "reports.xlsx";

        var result = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = streamContent
        };
        return result;

    }

我没有得到任何异常,但xlsx文件返回0bytes。

这里的断点

  

memoryStream.Write(inBuf,0,bytesRead);

这是提供返回文件的javascript

   $http.post('/api/GenerateMarketStudyResult/', Result, { responseType: 'arraybuffer' })
                   .success(function (response, status, headers, config) {
                       saveAs(new Blob([response], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }), 'reports.xlsx');
                   })

显示

  

bytesRead = 112336

0 个答案:

没有答案