Поделиться через


Шаг 3. Получение доступа к веб-службе

Следующим этапом после добавления ссылки на веб-службы Веб-службы Excel в проект является создание экземпляра прокси-класса веб-службы. Затем можно будет получить доступ к методам веб-службы путем вызова методов в прокси-классе. Когда приложение вызывает эти методы, код прокси-класса созданный Visual Studio, обрабатывает обмен данными между приложением и веб-службой.

Сначала требуется создать экземпляр прокси-класса веб-службы ExcelWebService. Затем с помощью прокси-класса выполняется вызов различных методов и свойств веб-службы. Такие вызовы используются для открытия книги, получения кода сеанса, предъявления стандартных учетных данных, определения объекта координат диапазона, получения диапазона, использующего объект координат диапазона, закрытия книги и перехвата исключений SOAP.

Получение доступа к веб-службе

Добавление директив

  1. Когда вы добавили веб-ссылку ранее, она создала объект с именем ExcelService в пространстве <имен yourProject>.< webReferenceName>. In this example, the object is named SampleApplication.ExcelWebService. This walkthrough also shows how to catch SOAP exceptions. To do so, you use the System.Web.Services.Protocols object. The System.Web.Services.Protocols namespace consists of the classes that define the protocols used to transmit data across the wire during the communication between XML Web service clients and XML Web services created using ASP.NET.

Для упрощения использования этих объектов необходимо сначала добавить пространства имен в качестве директив в файл Class1.cs. В этом случае при использовании таких директив не требуется указывать полные имена типов в пространстве имен.

  1. Чтобы добавить эти директивы, добавьте следующий код в начало кода в файле Class1.cs после. using System:
  
using SampleApplication.ExcelWebService;
using System.Web.Services.Protocols;
  
Imports SampleApplication.ExcelWebService
Imports System.Web.Services.Protocols

Способ вызова веб-службы

  1. Создайте экземпляр и инициализируйте объект прокси веб-службы, добавив следующий код после открывающей скобки в static void Main(string[] args):
  
ExcelService es = new ExcelService();
  Dim es As New ExcelService()
  1. Для создания массива состояний и объектов координат диапазона добавьте следующий код:
  Status[] outStatus;
RangeCoordinates rangeCoordinates = new RangeCoordinates();
  
Dim outStatus() As Status
Dim rangeCoordinates As New RangeCoordinates()
  1. Добавьте код, чтобы указать лист, к которому требуется получить доступ. В этом примере лист называется Sheet1. Добавьте в свой код следующее:

    
    string sheetName = "Sheet1";
    
    Dim sheetName As String = "Sheet1"
    

    Примечание.

    [!Примечание] Убедитесь, что в книге, которую вы хотите открыть, есть лист Sheet1, содержащий значения. Аналогично можно заменить имя Sheet1 в коде на другое имя листа.

  2. Добавьте приведенный ниже код, чтобы указать на книгу, которую вы хотите открыть.

    string targetWorkbookPath = "http://myserver02/example/Shared%20Documents/Book1.xlsx";
    
    Dim targetWorkbookPath As String = "http://myserver02/example/Shared%20Documents/Book1.xlsx"
    

    Важно!

    [!Важно!] Измените путь к книге, чтобы он соответствовал расположению книги, используемому в данном руководстве. Убедитесь, что книга существует и что расположение, где она хранится, является надежным расположением. Использование URL-адреса в формате HTTP для указания расположения книги позволяет получать к ней удаленный доступ.

    Примечание.

    [!Примечание] Получить путь к книге в Microsoft SharePoint Server 2010 можно, щелкнув ее правой кнопкой мыши и выбрав в меню пункт Копировать ярлык. Аналогично можно выбрать пункт Свойства и скопировать путь к рабочей книге в этом окне.

  3. Добавьте следующий код, чтобы указать учетные данные для запроса.

    Примечание.

    Требуется явно задать учетные данные, даже если вы намерены использовать учетные данные по умолчанию.

  es.Credentials = System.Net.CredentialCache.DefaultCredentials;
  es.Credentials = System.Net.CredentialCache.DefaultCredentials
  1. Добавьте следующий код, чтобы открыть книгу и указать надежное расположение, где размещается эта книга. Поместите код в блок try:
  try
{
string sessionId = es.OpenWorkbook(targetWorkbookPath, "en-US", 
    "en-US", out outStatus);
  
Try
Dim sessionId As String = es.OpenWorkbook(targetWorkbookPath, "en-US", "en-US", outStatus)
  1. Добавьте следующий код, чтобы подготовить объект для определения координат диапазона и вызвать метод GetRange. Код также выполнит печать общего количества строк в диапазоне и значений в конкретном диапазоне.
  
rangeCoordinates.Column = 3;
rangeCoordinates.Row = 9;
rangeCoordinates.Height = 18;
rangeCoordinates.Width = 12;

object[] rangeResult1 = es.GetRange(sessionId, sheetName,
    rangeCoordinates, false, out outStatus);
Console.WriteLine("Total rows in range: " + rangeResult1.Length);
Console.WriteLine("Value in range is: " + ((object[])rangeResult1[5])[2]);
  
rangeCoordinates.Column = 3
rangeCoordinates.Row = 9
rangeCoordinates.Height = 18
rangeCoordinates.Width = 12

Dim rangeResult1() As Object = es.GetRange(sessionId, sheetName, rangeCoordinates, False, outStatus)
Console.WriteLine("Total rows in range: " &amp; rangeResult1.Length)
Console.WriteLine("Value in range is: " &amp; (CType(rangeResult1(5), Object()))(2))
  1. Добавьте код, чтобы закрыть рабочую книгу и завершить текущий сеанс. Затем добавьте закрывающую скобку в конце блока try.

    Важно! Рекомендуется закрыть книгу при завершении работы с сеансом. Это приведет к закрытию сеанса и освобождению ресурсов.

  
es.CloseWorkbook(sessionId);
}
  
es.CloseWorkbook(sessionId)
  1. Добавьте блок catch для перехвата исключений SOAP и печати сообщения об исключении:
  catch (SoapException e)
{
    Console.WriteLine("SOAP Exception Message: {0}", e.Message);
}
  
Catch e As SoapException
    Console.WriteLine("SOAP Exception Message: {0}", e.Message)
End Try

Полный пример кода

Приведенный ниже пример кода представляет собой полный фрагмент кода в файле примера Class1.cs, который описывается выше.

Важно! При необходимости внесите изменения в путь рабочей книги, имя листа и т. д.


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 and range coordinate object
            ExcelService es = new ExcelService();
            Status[] outStatus;
            RangeCoordinates rangeCoordinates = new RangeCoordinates();
            
string sheetName = "Sheet1";
            // Using workbookPath this way will allow 
            // you to call the workbook remotely.
            // 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";
//you can also use .xlsb files, for example, //"http://myserver02/example/Shared%20Documents/Book1.xlsb";

            // Set credentials for requests
            es.Credentials = System.Net.CredentialCache.DefaultCredentials;
            //Console.WriteLine("Cred: {0}", es.Credentials);
            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);
                // Console.WriteLine("sessionID : {0}", sessionId);

                // Prepare object to define range coordinates
                // and the GetRange method.
                rangeCoordinates.Column = 3;
                rangeCoordinates.Row = 9;
                rangeCoordinates.Height = 18;
                rangeCoordinates.Width = 12;

                object[] rangeResult1 = es.GetRange(sessionId, sheetName, rangeCoordinates, false, out outStatus);
                Console.WriteLine("Total Rows in Range: " + rangeResult1.Length);
                Console.WriteLine("Value in range is: " + ((object[])rangeResult1[5])[3]); 
        
                // Close workbook. This also closes session.
                es.CloseWorkbook(sessionId);
            }
            catch (SoapException e)
            {
                Console.WriteLine("SOAP Exception Message: {0}", e.Message);
            }
            // 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 and range coordinate object
            Dim es As New ExcelService()
            Dim outStatus() As Status
            Dim rangeCoordinates As New RangeCoordinates()

Dim sheetName As String = "Sheet1"
            ' Using workbookPath this way will allow 
            ' you to call the workbook remotely.
            ' 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"
'you can also use .xlsb files, for example, //"http://myserver02/example/Shared%20Documents/Book1.xlsb";

            ' Set credentials for requests
            es.Credentials = System.Net.CredentialCache.DefaultCredentials
            'Console.WriteLine("Cred: {0}", es.Credentials);
            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)
                ' Console.WriteLine("sessionID : {0}", sessionId)

                ' Prepare object to define range coordinates
                ' and the GetRange method.
                rangeCoordinates.Column = 3
                rangeCoordinates.Row = 9
                rangeCoordinates.Height = 18
                rangeCoordinates.Width = 12

                Dim rangeResult1() As Object = es.GetRange(sessionId, sheetName, rangeCoordinates, False, outStatus)
                Console.WriteLine("Total Rows in Range: " &amp; rangeResult1.Length)
                Console.WriteLine("Value in range is: " &amp; (CType(rangeResult1(5), Object()))(3))

                ' Close workbook. This also closes session.
                es.CloseWorkbook(sessionId)
            Catch e As SoapException
                Console.WriteLine("SOAP Exception Message: {0}", e.Message)
            ' Catch e As Exception
            '    Console.WriteLine("Exception Message: {0}", e.Message)
            End Try
            'Console.ReadLine()
        End Sub
    End Class
End Namespace

См. также

Понятия

Доступ к API SOAP

Другие ресурсы

Шаг 1. Создание проекта клиента веб-службы

Этап 2. Добавление веб-ссылки

Этап 4. Построение и тестирование приложения

Пошаговое руководство. Разработка настраиваемого приложения с помощью веб-служб Excel

How to: Trust Workbook Locations Using Script