2012-02-20 21 views
2

我需要獲取控制器/操作的HTML標記以生成PDF。我所做的是:HttpWebRequest - ASP .NET MVC 3傳遞會話狀態

public ActionResult Index() 
    { 
     Session["Message"] = "SESSION-MESSAGE"; 

     String URL = "http://localhost:7401/Home/SuperComplex"; 

     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL); 
     req.CookieContainer = new CookieContainer(); 

     for (int i = 0; i <= this.Request.Cookies.Count - 1; i++) 
      req.CookieContainer.Add(
       new System.Net.Cookie(
        name: this.Request.Cookies[i].Name, 
        value: Request.Cookies[i].Value, 
        path: Request.Cookies[i].Path, domain: this.HttpContext.Request.Url.Host) 
       ); 

     using (var r = req.GetResponse()) 
     { 
      using (var s = new StreamReader(r.GetResponseStream())) 
      { 
       var htmlToPrint = s.ReadToEnd(); 
       Response.Write("<h1>" + htmlToPrint + "</h1>"); 
      } 
     } 

     return View(); 
    } 

考慮到上面所說的情況,在超複合會話,我應該有會話[「消息」。但由於一些奇怪的原因,它不會去那裏。

我檢查了Session.SessionId - 在這兩種情況下它都是一樣的。

此外,在第二個或第三個請求,請求超時!

還是那句話:http://localhost:7401/(S(SESSION_ID))/Home/About

如果需要在其他瀏覽:會話劫持確實發生了 - 但WebRequest的模具! :(

幫助 - ?任何人

+0

它是特定於ASP.NET MVC 4(。如果是這樣,請將標籤更改爲'asp.net-mvc-4'。如果沒有,請更改您問題的標題 – 2012-02-20 19:05:58

+0

謝謝Ofer - 修正了標題 – effkay 2012-02-20 19:06:45

+0

您沒有使用webrequest獲取從你自己的網站的HTML不是嗎?有更好的手段。 – usr 2012-02-20 20:01:49

回答

2

Store中的一個部分查看HTML,然後使用一個輔助功能,把它解析爲一個字符串

// usage 
/* 
* http://stackoverflow.com/questions/4344533/asp-net-mvc-razor-how-to-render-a-razor-partial-views-html-inside-the-controll 
* 
    var model = _repository.Find(x => x.PropertyID > 3).FirstOrDefault(); 
    var test = this.RenderViewToString("DataModel", model); 
    return Content(test); 
*/ 

public static string RenderPartialToString<T>(this ControllerBase controller, string partialName, T model) 
{ 
    var vd = new ViewDataDictionary(controller.ViewData); 
    var vp = new ViewPage 
    { 
     ViewData = vd, 
     ViewContext = new ViewContext(), 
     Url = new UrlHelper(controller.ControllerContext.RequestContext) 
    }; 

    ViewEngineResult result = ViewEngines 
           .Engines 
           .FindPartialView(controller.ControllerContext, partialName); 

    if (result.View == null) 
    { 
     throw new InvalidOperationException(
     string.Format("The partial view '{0}' could not be found", partialName)); 
    } 
    var partialPath = ((RazorView)result.View).ViewPath; 

    vp.ViewData.Model = model; 

    using(StringWriter sw = new StringWriter()) { 
     ViewContext viewContext = new ViewContext(controller.ControllerContext, result.View, vd, controller.TempData, sw); 
     result.View.Render(viewContext, sw); 

     return sw.GetStringBuilder().ToString(); 
    } 
} 
+0

是的,我做到了,向前邁進。感謝發佈回覆 - 也許別人可以從中受益:)。乾杯; – effkay 2012-03-01 14:03:47