2017-04-17 37 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