PDA

Vollständige Version anzeigen : Fehler beim Erstellen eines Word-Dokuments mit Webservice


schind
29.03.2007, 14:59
Hi Leute! Ich bin schon total verzweifelt und hoffe ihr könnt mir helfen ;) Wäre echt nett, wenn ihr euch die Zeit nehmen würdet, das doch relativ lange Posting zu lesen.

Ich programmiere ein Webservice, das eine XML - Datei vom MS Sharepoint Server übergeben bekommt. Die Daten dieser XML - Datei sollen ausgelesen und mithilfe einer Word-Vorlage soll ein Word-Dokument (Bestellformular) daraus generiert werden.

Das ganze funktioniert auf meinem lokalen Rechner wunderbar, wenn ich das ganze allerdings auf dem Webserver (IIS 6) laufen lasse, und den Webservice aufrufen möchte, funktioniert es nicht. Da der Aufruf des Webservices in MS InfoPath integriert ist, kann ich leider keine Rückgaben (Exceptions etc.) am Bildschirm sehen, deshalb schreibe ich alle Debugausgaben in eine Datei. Aufgrund dieser Ausgaben (Habe ich hier im Code nicht eingebunden) kann ich sagen, dass das Programm in einer der folgenden beiden Zeilen nicht mehr reagiert (wahrscheinlich in der unteren):
Word.ApplicationClass oWordApp = new Word.ApplicationClass();
Word.Document oWordDoc = new Word.Document();

Zusätzlich wird am Webserver in der Ereignisanzeige unter Microsoft Office Sessions die folgende Meldung angezeigt:
Ereignistyp: Warnung
Ereignisquelle: Microsoft Office 12 Sessions
Ereigniskategorie: Keine
Ereigniskennung: 7003
Datum: 29.03.2007
Zeit: 14:05:44
Benutzer: Nicht zutreffend
Computer: ECSHAREPIONT01
Beschreibung:
ID: 0, Application Name: Microsoft Office Word, Application Version: 12.0.4518.1014, Microsoft Office Version: 12.0.4518.1014. This session was terminated unexpectedly.

Außerdem sehe ich den Prozess WINWORD.EXE, der unter dem User NETZWERKDIENST läuft und anscheinend auf irgend etwas wartet, denn wenn ich ihn beende kommt die Exception:
System.Runtime.InteropServices.COMException (0x800706BE): Der Remoteprozeduraufruf ist fehlgeschlagen. (Ausnahme von HRESULT: 0x800706BE)
bei Microsoft.Office.Interop.Word.Documents.Add(Object& Template, Object& NewTemplate, Object& DocumentType, Object& Visible)
bei Service.createDoc() in c:\Inetpub\wwwroot\wss\VirtualDirectories\4700\App_Code\Service.cs:Zeile 186.neues xmldocument wurde erstellt

Ich bin wirklich schon verzweifel, sitze seit gestern und versuche den Fehler zu beheben, doch leider schaffe ich es nicht. Ich hoffe wirklich jemand nimmt sich die Zeit, das Programm durchzusehen. Es sieht zwar nach viel Code aus, der Fehler tritt allerdings schon sehr früh auf.

Vielen Dank!
lg, Schind

[WebMethod]
public string createDoc()
{
// Das XML - File laden und konvertieren.
xmlstring.Replace('\n', ' ');
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load("C:\\Inetpub\\wwwroot\\wss\\VirtualDirectories\\4700\\xmldata\\bestellung_temp.xm l");
XmlNamespaceManager nsManager = new XmlNamespaceManager(xmldoc.NameTable);
nsManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-10-21T21:12:27");
// Für die fehlenden Werte den entsprechenden value definieren
object missing = System.Reflection.Missing.Value;
Word.ApplicationClass oWordApp = new Word.ApplicationClass();
Word.Document oWordDoc = new Word.Document();
try
{
oWordApp = new Word.ApplicationClass();
// Template definieren
object oTemplate = "C:\\Inetpub\\wwwroot\\wss\\VirtualDirectories\\4700\\xmldata\\vorlage_bestellung .dotx";
oWordDoc = oWordApp.Documents.Add(ref oTemplate, ref missing, ref missing, ref missing);
}
catch (Exception exc)
{
sw = new StreamWriter(new FileStream("C:\\Inetpub\\wwwroot\\wss\\VirtualDirectories\\4700\\xmldata\\bestellung_temp1.x ml", FileMode.Append));
sw.Write(exc.ToString());
sw.Close();
}
oWordDoc.Activate();
// Den Firmennamen setzen
object oBookMark = "Firma";
string xpathquery = "/my:expenseReport/my:items/my:item/my:distributor";
XmlNode lieferantenNode = xmldoc.SelectSingleNode(xpathquery, nsManager);
oWordDoc.Bookmarks.get_Item(ref oBookMark).Range.Text = lieferantenNode.InnerText + "\n";

// Die Bestellnummer setzen
oBookMark = "BestNr";
xpathquery = "/my:expenseReport/my:bestellnummer";
XmlNode bestNode = xmldoc.SelectSingleNode(xpathquery, nsManager);
oWordDoc.Bookmarks.get_Item(ref oBookMark).Range.Text = bestNode.InnerText;
int bestellnummer = 0;
try
{
bestellnummer = Convert.ToInt32(bestNode.InnerText);
}
catch (Exception)
{ return "Fehler"; }

// die bestelltabelle füllen
oBookMark = "BestTab";
Word.Table oTable;
Word.Range wrdRng = oWordDoc.Bookmarks.get_Item(ref oBookMark).Range;

// Tabellenzeilen hängen von den Einträgen im XML - File ab
XmlNodeList items = xmldoc.GetElementsByTagName("my:item");

oTable = oWordDoc.Tables.Add(wrdRng, items.Count + 2, 5, ref missing, ref missing);
oTable.Range.ParagraphFormat.SpaceAfter = 6;

// Überschriftenzeile erstellen
oTable.Cell(1, 1).Range.Text = "Pos.";
oTable.Columns[1].Width = 30;
oTable.Cell(1, 2).Range.Text = "Menge";
oTable.Columns[2].Width = 40;
oTable.Cell(1, 3).Range.Text = "Artikelnummer/Bezeichnung";
oTable.Columns[3].Width = 250;
oTable.Cell(1, 4).Range.Text = "Einzelpreis";
oTable.Columns[4].Width = 80;
oTable.Cell(1, 5).Range.Text = "Gesamtpreis";
oTable.Columns[5].Width = 80;

// Füllen der Zeilen mit den Werten aus dem XML - File
int activeItem = 1;
foreach (XmlNode item in items)
{
oTable.Cell(++activeItem, 1).Range.Text = item.SelectSingleNode("my:position", nsManager).InnerText;
oTable.Cell(activeItem, 1).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;
oTable.Cell(activeItem, 2).Range.Text = item.SelectSingleNode("my:stueck", nsManager).InnerText;
oTable.Cell(activeItem, 2).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;
oTable.Cell(activeItem, 3).Range.Text = item.SelectSingleNode("my:description", nsManager).InnerText;
oTable.Cell(activeItem, 4).Range.Text = item.SelectSingleNode("my:ep", nsManager).InnerText + " €";
oTable.Cell(activeItem, 4).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;
oTable.Cell(activeItem, 5).Range.Text = item.SelectSingleNode("my:amount", nsManager).InnerText + " €"; ;
oTable.Cell(activeItem, 5).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;
}

// Summenzeile erzeugen
oTable.Cell(oTable.Rows.Count, 1).Merge(oTable.Cell(oTable.Rows.Count, 4));
oTable.Cell(oTable.Rows.Count, 1).Range.Text = "Summe:";
oTable.Cell(oTable.Rows.Count, 1).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;
xpathquery = "/my:expenseReport/my:items/my:total";
XmlNode totalNode = xmldoc.SelectSingleNode(xpathquery, nsManager);
oTable.Cell(oTable.Rows.Count, 2).Range.Text = totalNode.InnerText + " €";
oTable.Cell(oTable.Rows.Count, 2).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;

// 1. und letzte Zeile fett
oTable.Rows[1].Range.Font.Bold = 1;
oTable.Rows[oTable.Rows.Count].Range.Font.Bold = 1;

oTable.Borders.OutsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;
oTable.Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;
object filename = "C:\\Inetpub\\wwwroot\\wss\\VirtualDirectories\\4700\\xmldata\\bestellung_" + bestellnummer + ".docx";
oWordDoc.SaveAs(ref filename, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
object savechanges = false;
oWordDoc.Close(ref savechanges, ref missing, ref missing);
oWordApp.Quit(ref savechanges, ref missing, ref missing);
return "alles ok";
}

schind
30.03.2007, 11:26
Erstmal sorry, dass ich das Edit nicht benutzt habe, aber der ander Post ist ja schon von gestern.

Was mir nun gerade aufgefallen ist: Am PC, von dem aus das Webservice aufgerufen wird, werden auch 2 Fehlermeldungen ins Ereignis-Log eingetragen:
Ereignistyp: Fehler
Ereignisquelle: MSSOAP
Ereigniskategorie: Generic
Ereigniskennung: 16
Datum: 30.03.2007
Zeit: 11:22:29
Benutzer: Nicht zutreffend
Computer: SDCPC01WXP
Beschreibung:
Soap error: Verbindungstimeout..

Weitere Informationen über die Hilfe- und Supportdienste erhalten Sie unter http://go.microsoft.com/fwlink/events.asp.


und

Ereignistyp: Fehler
Ereignisquelle: MSSOAP
Ereigniskategorie: Generic
Ereigniskennung: 16
Datum: 30.03.2007
Zeit: 11:22:29
Benutzer: Nicht zutreffend
Computer: SDCPC01WXP
Beschreibung:
Soap error: Nicht angegebener HTTP-Fehler..

Weitere Informationen über die Hilfe- und Supportdienste erhalten Sie unter http://go.microsoft.com/fwlink/events.asp.


Könnte es also evtl. daran liegen, dass der Aufruf einfach zu lange dauert?? falls ja, kennt jemand eine Möglichkeit, dies zu beheben?