2010-02-24 24 views
9

Tôi cố gắng để sử dụng điều khiển WebBrowser trong một ứng dụng ASP NET:WebBrowser kiểm soát trong một ứng dụng web

public BrowserForm() 
     { 
      webBrowser1 = new WebBrowser(); 
      webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); 
     } 
private void webBrowser1_DocumentCompleted(Object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
    // code here 
    } 

Nhưng đã nhận lỗi:

'8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment

Sau đó, tôi đã làm một cái gì đó như thế này:

 public BrowserForm() 
     { 
      ThreadStart ts = new ThreadStart(StartThread); 
      var t = new Thread(ts); 
      t.SetApartmentState(ApartmentState.STA); 
      t.Start(); 

     } 
     [STAThread] 
     public void StartThread() 
     { 
      webBrowser1 = new WebBrowser(); 
      webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); 
     } 

     [STAThread] 
private void webBrowser1_DocumentCompleted(Object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      //code here 
     } 

Nhưng vẫn không hoạt động cho tôi như mong muốn ... cho tôi các lỗi đã lỗi như:

Error HRESULT E_FAIL has been returned from a call to a COM component

Mọi công việc xung quanh ?? Tôi không phải là một chuyên gia về luồng hoặc COM nhưng cố gắng chuyển đổi một WindowApplication thành WebApplication, trong đó có một ảnh chụp màn hình của một trang web được cung cấp một URL. :(

+0

Mặc dù bạn yêu cầu một giải pháp, nhưng chỉ cần nghĩ đến ... một cách để đạt được như vậy để tạo một điều khiển ActiveX rằng sẽ thực hiện công việc màn hình-shot, và thêm nó vào ứng dụng ASP.NET của bạn ... –

Trả lời

6

Kiểm tra CodeProject bài viết này Using the WebBrowser Control in ASP.NET.

Trong bài viết đó đi đến phần Thông số kỹ thuật, và ở đó bạn có thể thấy cách ông xử lý vấn đề này chủ đề STA.

First of all, a WebBrowser control has to be in a thread set to single thread apartment (STA) mode (see MSDN), so I need to create a thread and call the SetApartmentState() method to set it to ApartmentState.STA before starting it.

Hope this helps

Cheer

+1

Cách xử lý vấn đề chuỗi STA này? Tôi không thấy câu trả lời này hữu ích. Bạn có thể vui lòng giải thích cách anh ta xử lý vấn đề này, tôi không thể nhìn thấy nó. Đó không phải là giải thích tốt để chỉ liên kết đến một trang khác ... –

0

Bạn có thể đặt AspCompat = "true" trong chỉ thị trang của trang và nó sẽ chạy trong một STA. Sau khi bạn đã làm điều đó ví dụ đầu tiên bạn nên làm việc

0

WinInet is not supported for use in services, có nghĩa là bất kỳ ứng dụng nào sử dụng WinInet, chẳng hạn như kiểm soát trình duyệt web của IE, không được hỗ trợ trong các dịch vụ (ví dụ: dịch vụ asp.net).

0

Tại sao bạn sử dụng điều khiển trình duyệt web trong ứng dụng dựa trên asp.net?
Dường như bạn muốn có trình duyệt bên trong trình duyệt.

Sử dụng nó, bạn đang hạn chế đối tượng sử dụng IE (và Windows, tôi giả sử).

Bạn không thể sử dụng IFrame hoặc Ajax hoặc một số giải pháp thay thế khác?
Đăng lý do của bạn & mọi người có thể đề xuất giải pháp thay thế tốt hơn.

+0

Hỏi "Tại sao?" phản tác dụng trong trường hợp này. Hoặc đưa ra một câu trả lời hoặc đề xuất một cách để hoàn thành nhiệm vụ: "... cố gắng chuyển đổi một WindowApplication thành WebApplication, trong đó có một ảnh chụp màn hình của một trang web được cung cấp một URL." – Dror

+0

Tại sao? Bởi vì tôi muốn in một trang HTML đến một máy in và bạn phải sử dụng một WebBrowser. –

Các vấn đề liên quan