2016-07-30 2 views
2

Ich habe einen WebSocket-basierten Texteditor, den ich für ein College-Projekt geschrieben habe. Funktioniert auf meinem lokalen Computer einwandfrei, aber bei der Bereitstellung in Azure erhalte ich einen Fehler.Azure App gibt HRESULT E_FAIL wurde von einem Aufruf an eine COM-Komponente zurückgegeben

Das Problem entsteht mit der Konvertierung von HTML in RTF, die ich mit einer Mischung von Code aus here und here. Dies erforderte die Verwendung von Windows-Komponenten in einer Single-Thread-Wohnung und war ein wenig Kopfschmerzen, aber es hat funktioniert ... bis ich nach Azure migriert.

Debuggen in Visual Studio, bekam ich die Fehlermeldung:

System.Runtime.InteropServices.COMException was unhandled 
    ErrorCode=-2147467259 
    HResult=-2147467259 
    Message=Error HRESULT E_FAIL has been returned from a call to a COM component. 
    Source=System.Windows.Forms 
    StackTrace: 
     at System.Windows.Forms.UnsafeNativeMethods.IWebBrowser2.Navigate2(Object& URL, Object& flags, Object& targetFrameName, Object& postData, Object& headers) 
     at System.Windows.Forms.WebBrowser.PerformNavigate2(Object& URL, Object& flags, Object& targetFrameName, Object& postData, Object& headers) 
     at System.Windows.Forms.WebBrowser.set_Url(Uri value) 
     at System.Windows.Forms.WebBrowser.set_DocumentStream(Stream value) 
     at System.Windows.Forms.WebBrowser.set_DocumentText(String value) 
     at RealTimeTextEditor.HtmlRtfConvertor.ConvertHtmltoRtf(Object obj) in C:\DissertationProjectGitRepo\RealTimeTextEditor\RealTimeTextEditor\HtmlRtfConvertor.cs:line 30 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart(Object obj) 
    InnerException: 

Der problematische Code hier gefunden wird, tritt Ausnahme bei der Zeile "tempBrowser.DocumentText = data.html;"

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Threading; 
using System.Web; 
using System.Windows.Forms; 

namespace RealTimeTextEditor 
{ 
    public class HtmlRtfConvertor 
    { 
     public void ThreadConvertor(string inputpath, string inputhtml) 
     { 
      var t = new Thread(ConvertHtmltoRtf); 
      var dataForConversion = new ConvertorData { path = inputpath, html = inputhtml }; 
      t.SetApartmentState(ApartmentState.STA); 
      t.Start(dataForConversion); 
      t.Join(); 

     } 

     public static void ConvertHtmltoRtf (object obj) 
     { 
      var data = obj as ConvertorData; 
      using (WebBrowser tempBrowser = new WebBrowser()) 
      { 
       tempBrowser.CreateControl(); 
       tempBrowser.DocumentText = data.html; 
       while (tempBrowser.DocumentText != data.html) 
       { 
        Application.DoEvents(); 
       } 
       tempBrowser.Document.ExecCommand("SelectAll", false, null); 
       tempBrowser.Document.ExecCommand("Copy", false, null); 
       using (RichTextBox rtb = new RichTextBox()) 
       { 
        rtb.Paste(); 
        rtb.SaveFile(data.path); 

       } 
      } 

     } 

     public class ConvertorData 
     { 
      public string path { get; set; } 
      public string html { get; set; } 
     } 

    } 
} 

Der Code-Controller, der die HTML-Konverter-Klasse ruft:

 HtmlRtfConvertor convertor = new HtmlRtfConvertor(); 
     convertor.ThreadConvertor(path, html); 
+0

Wo haben Sie bereit: Web-Anwendungen? Cloud-Service (Web/Arbeiter)? vm? –

+0

@David Makogon - es ist eine Web-App, die eine Verbindung zu einer SQL-Datenbank herstellt. –

Antwort

0

Zugang zu Out-of-Process-COM- in der Web App Sandbox beschränkt ist.

Sehen Sie meine anderen Antwort hier für nähere Details: https://stackoverflow.com/a/38622209/4148708

+0

Danke für die Eingabe, ich habe den Artikel über Azure Sandboxes gelesen, der sehr hilfreich war. Ich nehme an, dies bedeutet, dass ich eine andere Hosting-Lösung in Betracht ziehen muss? Ich bin neu bei Azure, entschuldige bitte meine Unwissenheit. –

+0

Korrekt. Sehen Sie sich Azure Cloud Services (Webrolle) oder virtuelle Maschinen (IaaS) an. Hier finden Sie eine praktische Anleitung zum Konvertieren eines Webprojekts in eine Webrolle (Cloud Services) - https://azure.microsoft.com/en-us/documentation/articles/vs-azure-tools-migrate-publish-web -app-zu-Cloud-Service / – evilSnobu

Verwandte Themen