Gewusst wie: Asynchrones Verwenden des CloseWorkbook-Methodenaufrufs

Letzte Änderung: Mittwoch, 24. März 2010

Gilt für: SharePoint Server 2010

Wenn Sie die Excel-Webdienste verwenden, hat es sich bewährt, die Arbeitsmappe durch Aufrufen der CloseWorkbook-Methode zu schließen, wenn Sie die Sitzung beenden möchten. Hierdurch wird die Sitzung geschlossen, und Excel Services kann Ressourcen auf vorhersagbare Weise freigeben. Hiermit lassen sich u. U. Serverleistung und -robustheit verbessern.

Jeder Webdienstaufruf benötigt jedoch Zeit. Je nachdem, wie der Server installiert ist, wie Sie auf ihn zugreifen und wie stark der Server beansprucht wird, kann der Aufruf irgendetwas zwischen 50 Millisekunden und 500 Millisekunden in Anspruch nehmen. Der Aufruf kann auch noch länger dauern; dies ist jedoch nur der Fall, wenn der Server sehr stark beansprucht wird.

Da ein gescheiterter Aufruf der CloseWorkbook-Methode keine Aktion nach sich zieht, müssen Sie nicht auf die Beendigung des Aufrufs warten, um festzustellen, ob er erfolgreich ist. Sie können den Aufruf daher normalerweise asynchron ausführen und Ausführungszeit sparen.

HinweisHinweis

Wenn eine Anwendung einige Aufrufe an Excel Services ausgibt und dann beendet wird, kann es sich empfehlen, eine Arbeitsmappe nicht asynchron, sondern synchron zu schließen. In diesem Fall rufen Sie die CloseWorkbook-Methode anstelle der CloseWorkbookAsync-Methode auf, denn wenn Sie den Prozess unmittelbar nach dem Ausgeben eines asynchronen Aufrufs beenden, ist es möglich, dass der Aufruf nicht ankommt.

Zum asynchronen Schließen der Arbeitsmappe sind zwei Dinge erforderlich:

  • Stellen Sie sicher, dass die Excel-Webdienste-Proxyklasse nicht gelöscht wird. Andernfalls ist es möglich, dass Excel Services-fremde Ausnahmebedingungen auftreten.

  • Rufen Sie die CloseWorkbookAsync-Methode anstelle der CloseWorkbook-Methode auf. Die Signatur für die CloseWorkbookAsync-Methode lautet wie folgt:

    public void CloseWorkbookAsync(string sessionId)
    
    Public Sub CloseWorkbookAsync(ByVal sessionId As String)
    End Sub
    

Sie müssen das Ereignis, das beim Aufrufen der CloseWorkbookAsync-Methode aufgerufen wird, nicht implementieren.

Sie finden die Signatur in der Datei Reference.cs im Projektverzeichnis Web References.

HinweisHinweis

Sie finden die CloseWorkbookAsync-Methode in der Proxyklasse, die generiert wird, wenn Sie einen Webverweis mithilfe von Microsoft Visual Studio 2005 hinzufügen. Wenn Sie Visual Studio 2003 verwenden, rufen Sie stattdessen die BeginCloseWorkbook-Methode auf, um eine Arbeitsmappe asynchron zu schließen.

Das Aufrufen der CloseWorkbookAsync-Methode oder der BeginCloseWorkbook-Methode bedeutet, dass der Aufruf zu Schließen einer Arbeitsmappe asynchron ausgeführt wird, sodass für die Anwendung keine signifikanter zeitlicher Aufwand entsteht.

Beispiel

Das folgende Beispiel zeigt, wie eine Arbeitsmappe asynchron mithilfe von Visual Studio 2005 geschlossen wird.

using System;
using SampleApplication.ExcelWebService;
using System.Web.Services.Protocols;
namespace SampleApplication
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {            
            // Instantiate the Web service 
            // and create a status array object.
            ExcelService es = new ExcelService();
            Status[] outStatus;

            string sheetName = "Sheet1";
            // TODO: change the workbook path to 
            // point to workbook in a trusted location
            // that you have access to. 
            string targetWorkbookPath = 
             "http://myserver02/example/Shared%20Documents/Book1.xlsx";

            // Set credentials for requests.
            es.Credentials = 
                System.Net.CredentialCache.DefaultCredentials;
            
            try
            {
                // Call open workbook, and point to the trusted   
                // location of the workbook to open.
                string sessionId = es.OpenWorkbook(targetWorkbookPath, 
                    "en-US", "en-US", out outStatus);
                // Call the GetCell method 
                // to retrieve a value from a cell.
                // The cell is in the first row and ninth column.
                object[] rangeResult2 = xlservice.GetCell(sessionId, 
                    sheetName, 0, 8, false, out outStatus);
 
                // Close the workbook asynchronously. 
                // This also closes session.
                es.CloseWorkbookAsync(sessionId);
            }
            catch (SoapException e)
            {
                Console.WriteLine("SOAP Exception Message: {0}", 
                   e.Message);
                Console.WriteLine("SOAP Exception Error Code: {0}", 
                   e.SubCode.Code.Name);
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception Message: {0}", e.Message);
            }
            // Console.ReadLine();
        }
    }
}
 
Imports System
Imports SampleApplication.ExcelWebService
Imports System.Web.Services.Protocols
Namespace SampleApplication
    Friend Class Class1
        <STAThread> _
        Shared Sub Main(ByVal args() As String)
            ' Instantiate the Web service 
            ' and create a status array object.
            Dim es As New ExcelService()
            Dim outStatus() As Status

            Dim sheetName As String = "Sheet1"
            ' TODO: change the workbook path to 
            ' point to workbook in a trusted location
            ' that you have access to. 
            Dim targetWorkbookPath As String = "http://myserver02/example/Shared%20Documents/Book1.xlsx"

            ' Set credentials for requests.
            es.Credentials = System.Net.CredentialCache.DefaultCredentials

            Try
                ' Call open workbook, and point to the trusted   
                ' location of the workbook to open.
                Dim sessionId As String = es.OpenWorkbook(targetWorkbookPath, "en-US", "en-US", outStatus)
                ' Call the GetCell method 
                ' to retrieve a value from a cell.
                ' The cell is in the first row and ninth column.
                Dim rangeResult2() As Object = xlservice.GetCell(sessionId, sheetName, 0, 8, False, outStatus)

                ' Close the workbook asynchronously. 
                ' This also closes session.
                es.CloseWorkbookAsync(sessionId)
            Catch e As SoapException
                Console.WriteLine("SOAP Exception Message: {0}", e.Message)
                Console.WriteLine("SOAP Exception Error Code: {0}", e.SubCode.Code.Name)
            Catch e As Exception
                Console.WriteLine("Exception Message: {0}", e.Message)
            End Try
            ' Console.ReadLine();
        End Sub
    End Class
End Namespace

Robuste Programmierung

Stellen Sie sicher, dass Sie einen Webverweis auf eine Excel-Webdienste-Website hinzufügen, auf die Sie zugreifen können. Ändern Sie die using SampleApplication.ExcelWebService;-Anweisung, sodass sie auf die Webdienstsite zeigt, auf die Sie verweisen.

Nehmen Sie darüber hinaus ggf. Änderungen am Arbeitsmappenpfad, am Blattnamen usw. vor.

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Entwickeln einer benutzerdefinierten Anwendung mithilfe der Excel-Webdienste

Gewusst wie: Abfangen von Ausnahmen

Gewusst wie: Festlegen eines Speicherorts als vertrauenswürdig

Gewusst wie: Speichern im Excel-Client auf dem Server

Gewusst wie: Verwenden der "SubCode"-Eigenschaft zum Abfangen von Fehlercodes

Konzepte

Zugreifen auf die SOAP-API

Excel Services Alerts

Bekannte Probleme und Tipps für Excel Services

Loopback-SOAP-Aufrufe und direkte Verknüpfung