Web Api Pdf下载和路由

时间:2014-04-23 19:25:43

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-web-api2

所以我试图在我的项目中使用web Api并实现。

有两件事我不太确定

  1. 我正在尝试下载pdf。我的web api在App Server中,我在我的Web服务器中使用它。
  2. 在我的web api中,我在控制器中有一个方法

    public class FilesController : ApiController
    {        
        [ActionName("GetFile")]
        public HttpResponseMessage GetFile(string FileName, string CEQRNumber, string LatestMileStone)
        {
            var file = GetListofFilesByCEQRAndMilestone(FileName, CEQRNumber, LatestMileStone);
            var path = file.FilePath;
            var extension = file.FileExtention;
            HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
            var stream = new FileStream(path, FileMode.Open,FileAccess.ReadWrite);
            result.Content = new StreamContent(stream);
    
            if (extension == ".pdf")
                result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
    
            if (extension == ".xlsx" || extension == ".xls")
                result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    
            if (extension == ".zip")
                result.Content.Headers.ContentType = new MediaTypeHeaderValue("aapplication/zip");
    
            return result;
        }
    }
    

    现在我不知道如何消费它。在我的Web服务器的主要mvc应用程序中。我有一个行动方法

    public ActionResult GetFile(string fileName, string ceqrNum, string latestMS, string token)
    {
        string url = "https://xxx/api/Files/GetFile/" + fileName + "/" + ceqrNum + "/" + latestMS;
    
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/pdf"));
    
                Task<String> response = client.GetStringAsync(url);
    
                // NOT SURE HOW TO CONVERT RESPONSE TO PDF
    
            }
    }
    
    1. 我的第二个问题是路由:在webApiConfig.cs中有一个默认路由设置

       public static void Register(HttpConfiguration config)
       {
          config.Routes.MapHttpRoute(
              name: "DefaultApi",
              routeTemplate: "api/{controller}/{action}/{id}",
              defaults: new { id = RouteParameter.Optional }
          );
       }
      
    2. 我注意到如果我必须有不同的参数,我必须在config

      中添加

      所以我添加了

      config.Routes.MapHttpRoute(
                  name: "GetFileList",
                  routeTemplate: "api/{controller}/{action}/{CEQRNumber}/{LatestMileStone}",
                  defaults: new
                  {
                      CEQRNumber = UrlParameter.Optional,
                      LatestMileStone = UrlParameter.Optional,
                  }
              );
      
              config.Routes.MapHttpRoute(
                  name: "GetFileForDownload",
                  routeTemplate: "api/{controller}/{action}/{FileName}/{CEQRNumber}/{LatestMileStone}",
                  defaults: new
                  {
                      Controller = "Files",
                      FileName = UrlParameter.Optional,
                      CEQRNumber = UrlParameter.Optional,
                      LatestMileStone = UrlParameter.Optional
                  }
              );
      

      现在,我可以使用一条默认路由,无论参数和动作名称如何,或者我必须编写新路径的每个不同动作和参数。

      我将非常感谢您的回答。我试图理解web api的概念,因为这是我第一次使用它。

      由于

1 个答案:

答案 0 :(得分:0)

一些评论 -

  1. 不要以读/写方式打开文件,阅读就好了。

  2. 第二条路线很好,你不需要第一条路线,你也可以发布到以下路线:

  3. api/{controller}/{FileName}/{CEQRNumber}/{LatestMileStone}

    并从GetFiles中删除[ActionName]属性。

    更简单的是,您可以使用以下路线 api/{controller}并将参数作为查询字符串传递。

    所以它看起来像这样

    config.Routes.MapHttpRoute(
        routeTemplate: "api/{controller}"
    );
    

    您的网址将如下所示:

    http://xxx/api/Files?FileName=foo&CEQRNumber=bar,&LatestMileStone
    

    控制器代码:

    public class FilesController : ApiController
    {        
        public HttpResponseMessage GetFile(string FileName, string CEQRNumber, string LatestMileStone)
        {
            var file = GetListofFilesByCEQRAndMilestone(FileName, CEQRNumber, LatestMileStone);
            var path = file.FilePath;
            var extension = file.FileExtention;
            var result = new HttpResponseMessage(HttpStatusCode.OK);
            var stream = new FileStream(path, FileMode.Open,FileAccess.Read);
            result.Content = new StreamContent(stream);
    
            // do the header work
            return result;
        }
    }
    

    对于您的客户端代码而不是ReadAsStringAsync,请使用

     using (Stream responseStream = await response.Content.ReadAsStreamAsync())
     {
         // Read response stream
         await ReadResponseStreamAsync(responseStream, fileName);
     }
    

    并且不要忘记验证客户端上的响应代码

    有关如何从流中保存文件的评论:

     private void ReadResponseStreamAsync(stream responseStream, string fileName)
     {
          using (var fileStream = File.Create("C:\\Path\\To\\" + fileName))
          {
                responseStream.CopyTo(fileStream);
          }
     }