2017-04-17 82 views
0

给定MVC控制器方法,即构建并返回PDF从webapi2服务调用常规MVC控制器方法

[HttpGet] 
    [Route("pdf/{acc}/{sign}")] 
    public async Task<ActionResult> Download(string acc, string sign) 
    { 
     ... // omitted some irrelevant detail. 
     var html = this.View("Letter", model).Capture(this.ControllerContext); 
     byte[] pdf = this.CreatePdfFromHtml(html); 
     return this.File(binary, "application/pdf", file); 
    } 

Capture扩展方法捕获html输出,然后将其返回为一个文件。

我需要在下面的webapi2方法执行上面的方法(或关闭)。 我需要凭据和其他登录状态。 webapi和MVC请求位于使用cookie进行安全性的相同应用程序中。

[HttpPost] 
    [Route("generate")] 
    public int Generate(MyRequestModel request) 
    { 
     byte[] pdf = ... // how do i get the file above?? 
    } 

回答

2

您应该要求通过HttpClient或简称MVC动作分解出的PDF创建到你的MVC和Web API操作既可以引用一个辅助类。

使用第一种方法,您需要对如何验证请求进行验证,这对于MVC操作来说有点困难。 MVC使用多步授权:登录,验证,设置cookie,重定向。您将不得不按照相同的步骤来获取通过HttpClient设置的cookie。把它想象成一个小小的浏览器。另一方面,Web Api只接受Authorization头,因为API请求是幂等的。

最简单也是最直接的路由,特别是因为您的MVC和Web Api都驻留在同一个应用程序中,只是简单地将PDF创建代码分解为辅助类。然后,您的MVC和Web Api操作可以简单地调用该类上的某种方法来获取PDF,从而减少代码重复。

+0

感谢克里斯 - 问题在于,PDF是通过从mvc视图中捕获HTML生成的,因此分解PDF生成代码正是问题所在。我可能不得不去创建一个客户端 - 这看起来像很多箍.... – Jim

+0

我想我只是从角度调用一个常规的MVC方法,它只是为了一致性,我想使用webapi。 – Jim

相关问题