2011-01-21 2 views
0

Я пытаюсь распечатать веб-страницу на принтере по умолчанию на веб-сервере. Я нашел the holy grail, и он работает, но печатает страницу входа не на целевую страницу, что имеет смысл, потому что контроллер требует авторизации с использованием членства asp.net с настройкой запаса. Я нашел this writeup, где упоминается, что вы можете использовать dom-интерфейсы, если используете формы auth (подумайте, что это я), но я не уверен, как это сделать. Похоже, это позволит браузеру перейти на страницу входа и отправить имя пользователя/пароль обратно, чтобы, наконец, попасть на целевую страницу? Любое понимание наилучшего способа продолжения было бы очень полезно, я бы не подумал, что это будет связано с печатью страницы, которая уже отображена (хотя серверная часть печати имеет смысл). Благодаря!asp.net-mvc пытается распечатать серверную сторону, где контроллер требует авторизации

Edit: Это работает: (по-видимому, печенье это одна вещь, которую вы не можете установить в вызове метода browser.Navigate)

  HttpCookie cookie = Request.Cookies[".ASPXAUTH"]; 

      InternetSetCookie(htmlPath, ".ASPXAUTH", cookie.Value); 

      browser.Navigate(htmlPath); 
      while (browser.ReadyState != WebBrowserReadyState.Complete) 
       Application.DoEvents(); 

      dynamic ie = browser.ActiveXInstance; 
      ie.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, PRINT_WAITFORCOMPLETION); 

и отдельно:

  [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] 
      static extern bool InternetSetCookie(string lpszUrl, string lpszCookieName, string lpszCookieData); 

Это может быть дополнительно улучшена за счет использования ваш код, чтобы получить форму cookie специально, а не по имени в качестве моего кода.

ответ

0

Элемент управления WebBrowser имеет метод перегрузки метода Navigate, который позволяет передавать дополнительные HTTP-заголовки в запрос. В последнем аргументе можно передать заголовок печенье, как это:

browser.Navigate(htmlPath, null, null, "Cookie: authCookie=value" + Environment.NewLine); 

, где, очевидно, вам нужно заменить authCookie с именем куки аутентификации вашего веб-сайта и ожидает value со значением, взятой из запроса печенья.

+0

Спасибо! Я должен был там посмотреть. Я близок, я думаю, но все еще получаю логин, см. Мое редактирование. –

+0

пробовали различные вещи, включая добавление обоих файлов cookie в строку, но когда я смотрю на своих локалей, cookie документа cookie по-прежнему остается нулевым. любая идея, чего не хватает? Спасибо –

+0

@Vince, почему вы используете секцию sessionState, чтобы прочитать имя файла cookie? Здесь мы говорим об аутентификации. Не сеанс. Это не одно и то же. Сделайте это вместо этого: 'Request.Cookies [FormsAuthentication.FormsCookieName]'. –

Смежные вопросы