Выполнение приложения в активном сеансе и вне сеанса 0 с помощью службы IIS
I am running asp.net website on IIS its run on service. and I want to open Excel file with GUI, so I must use the active session.
Что я уже пробовал:
Это мой файл aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication2.WebForm1" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> </form> </body> </html>
Это мой aspx-файл.файл CS :
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using murrayju.ProcessExtensions; namespace WebApplication2 { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { string x = @"C:\www\zmqpga.com\reports\F.xlsx"; ProcessExtensions.StartProcessAsCurrentUser(x); } } }
Это делает следующую ошибку http://prntscr.com/g4q1uo
И когда я использую другое решение, например
System.Diagnostics.Process process1 = new System.Diagnostics.Process(); process1.StartInfo.WorkingDirectory = Request.MapPath("~/"); process1.StartInfo.FileName = Request.MapPath("F.xlsx"); process1.StartInfo.Arguments = " "; process1.StartInfo.LoadUserProfile = true; process1.Start(); process1.WaitForExit(); process1.Close();
Это открытый процесс Excel(когда я смотрю на Диспетчер задач). Но мне нужен графический интерфейс, поэтому я должен запустить его на активном сеансе. Кто-нибудь знает простой способ сделать это? можете ли вы привести мне какой-нибудь пример кода? Я просто понятия не имею...
для ProcessExtensions я использую это https://github.com/murrayju/CreateProcessAsUser
Для второго решения после многих попыток, когда я использую удаленную отладку, я просто застреваю на process1. Start (); и после тайм-аута я получил ошибку на process1. WaitForExit (); из-за
An exception of type 'System.InvalidOperationException' occurred in System.dll but was not handled in user code
Дополнительная информация: ни один процесс не связан с этим объектом.
Надеюсь, что кто-то поможет, Спасибо
Kornfeld Eliyahu Peter
Вам это ясно? Он будет - если и когда-открывать файл Excel на сервере! Кто на это посмотрит? И что вы будете делать, если 12345 пользователей попросят сделать этот процесс? Открыть 12345 файлов Excel на сервере?!
Member 9965700
У меня сейчас нет проблем с более чем 1 Пользователем в одно и то же время.
Я объясню проблему
У меня есть файл xltm, который запускает VB-код(я должен использовать этот файл Excels как есть).
Этот VB код открывает книгу Excel и обновляет ее в графическом интерфейсе
(Это то, что я думаю, что он делает) И потому, что у него нет графического интерфейса на сеансе 0. Эта программа застревает на process1. Start();
И не запускайте файл...
Может быть, у вас есть идея решить ее по-другому?
Member 9965700
есть идеи?
Kornfeld Eliyahu Peter
Как я мог дать вам хоть какое-то представление, если вы не отвечаете на мои вопросы...
Member 9965700
Вам это ясно? Он будет - если и когда-открывать файл Excel на сервере! Кто на это посмотрит?
- Этот файл Excel запускает vb-код, он использует рабочую книгу и должен уметь хорошо использовать графический интерфейс для работы... никто не будет смотреть на него, но программа должна его использовать (вот что я думаю, может быть, я понял проблему...) Это я думаю, потому что в режиме отладки он хорошо работает (на сеансе пользователя) при использовании удаленного консольного приложения (на сеансе пользователя) Это хорошо работает.
Проблема заключается в запуске при использовании asp.net веб-сайт на IIS as service и начните пытаться запустить файл Excel из него (сеанс 0)...
И что вы будете делать, если 12345 пользователей попросят сделать этот процесс? Открыть 12345 файлов Excel на сервере?!.
- Вообще-то у меня сейчас нет проблем с 12345 пользователями...
У меня есть проблема максимума 5,6 в то же время...
Я думаю, что машина может справиться с этим...
Поэтому ответ-Теоретически да для 12345 пользователям он будет открывать файлы 12345
Но опять же я не хочу тратить свое время на решение сложных проблем, и мне нужно будет действительно иметь дело с ними в реальной жизни, но только в теории...
Kornfeld Eliyahu Peter
1. Открытие связанных с пользовательским интерфейсом вещей на сервере, формирование размещенного в IIS приложения-это, вероятно, самое худшее, что вы можете сделать. Если никто не будет смотреть на этот пользовательский интерфейс, вам это не нужно! Попробуйте использовать VSTO для манипулирования документом. Если документ содержит VBA, то вам придется предоставить пользователю IIS дополнительные права, иначе файл будет открыт с отключенными макросами.
https://msdn.microsoft.com/en-us/library/b3k79a5x.aspx
http://www.siddharthrout.com/2012/03/20/calling-excel-macros-programmatically-in-vb-net/
2. Даже если у вас есть 2 пользователя и оба пытаются открыть один и тот же файл (и манипулировать им), у вас возникнут проблемы с одновременным доступом... Возможно, ваш дизайн здесь вообще не сработает... Вы можете поделиться с нами точной проблемой, которую вы пытаетесь решить, манипулируя этим файлом Excel...
Member 9965700
Я действительно не хочу менять код VBA, это не мой код, и я предпочитаю использовать его как черный ящик, пока могу.
Файл Excel, который я пытаюсь открыть, - это template. xltm, и каждый сеанс делает свою собственную копию рабочей книги.
Kornfeld Eliyahu Peter
Шаблон-это хорошее начало - теперь учитесь пользоваться VSTO (это также избавит вас от установки приложения на сервер)...
Member 9965700
Я не могу изменить код VBA, я должен использовать его как есть
Kornfeld Eliyahu Peter
Разве я сказал, чтобы изменить его? Все, что я сказал, чтобы использовать VSTO для доступа к файлу Excel, вместо того, чтобы устанавливать Excel и использовать старую объектную модель...
Member 9965700
Но если код VBA не использует VSTO, мне придется его изменить, верно?