Freigeben über


Gewusst wie: Erstellen einer UDF, die einen Webdienst aufruft

Letzte Änderung: Donnerstag, 21. Januar 2010

Gilt für: SharePoint Server 2010

In diesem Beispiel wird gezeigt, wie Sie einen externen Webdienst von einer benutzerdefinierte Funktion (User-Defined Function, UDF) aufrufen. In diesem Beispiel wird der folgende Webdienst verwendet:

http://webservices.imacination.com/distance/Distance.jws?wsdl

Zum Erstellen dieses Beispiels müssen Sie Microsoft Visual Studio 2005 oder ein vergleichbares, mit Microsoft .NET Framework 2.0–kompatibles Entwicklungstool verwenden.

HinweisHinweis

Stellen Sie vor dem Testen des Codes sicher, dass der Webdienst, den Sie aufrufen, verfügbar ist. Es ist möglich, dass der Webdienstserver heruntergefahren oder der Webdienst eingestellt wurde. Wenn der Webdienst nicht verfügbar ist, führen die codeseitigen Aufrufe des Webdienstes zu einem Fehler.

Sie können die Verfügbarkeit eines Webdienstes überprüfen, indem Sie die entsprechende Website aufrufen. In diesem Beispiel handelt es sich um folgende URL:

http://webservices.imacination.com/distance/Distance.jws?wsdl

Wenn der Webdienst verfügbar ist, können Sie die Web Services Description Language (WSDL) sehen. Falls er nicht verfügbar ist, wird der übliche Fehler "Webseite nicht gefunden" angezeigt.

Beispiel

Sie erfahren mehr über den Webdienst, der in diesem Beispiel verwendet wird, indem Sie sich mit dessen WSDL beschäftigen.

Ein Dienst, der bereitgestellt wird, ist das Zurückgeben geografischer Koordinaten im Dezimalformat. In diesem Beispiel wurde die ToDegreeNotation-Funktion hinzugefügt, um zu zeigen, wie Sie Koordinaten in das Format mit Grad, Minuten und Sekunden umwandeln können, was zur Anzeige von Koordinaten besser geeignet ist.

[UdfMethod]
public string ToDegreeNotation(double angle)
{
    int deg = (int)angle;
    double minutesAndSeconds = Math.Abs(angle - deg) * 60;
    int minutes = (int)minutesAndSeconds;
    int seconds = (int)(Math.Abs(minutesAndSeconds - minutes) * 60);

    return deg.ToString() + "°" + minutes.ToString() + "\'" + 
        seconds.ToString() + "\"";
}
<UdfMethod> _
Public Function ToDegreeNotation(ByVal angle As Double) As String
    Dim deg As Integer = CInt(Fix(angle))
    Dim minutesAndSeconds As Double = Math.Abs(angle - deg) * 60
    Dim minutes As Integer = CInt(Fix(minutesAndSeconds))
    Dim seconds As Integer = CInt(Fix(Math.Abs(minutesAndSeconds - minutes) * 60))

    Return deg.ToString() & "°" & minutes.ToString() & "'" & seconds.ToString() & """"
End Function

Wenn die LAN-Einstellungen in Internet Explorer so konfiguriert sind, dass ein Proxyserver verwendet wird, muss der Code explizit einen Aufruf enthalten, um den Proxyserver festzulegen. Andernfalls führen die Webdienstaufrufe zu einem Fehler. Sie können den Proxyserver folgendermaßen im Konstruktor festlegen:

namespace ZipCodeUdfSample
{
    [UdfClass]
    public class ZipCodeUdfs
    {
        DistanceService distanceService = null;
        public ZipCodeUdfs()
        {
            this.distanceService = new DistanceService();
            this.distanceService.Proxy = 
                new WebProxy("http://myproxy:80", true);
        }
Namespace ZipCodeUdfSample
    <UdfClass> _
    Public Class ZipCodeUdfs
        Private distanceService As DistanceService = Nothing

        Public Sub New()
            Me.distanceService = New DistanceService()
            'this.distanceService.Proxy = new WebProxy("http://myproxy:80", true);
        End Sub

Weitere Informationen zum Testen und Aufrufen von UDFs über Arbeitsmappenzellen finden Sie unter Exemplarische Vorgehensweise: Entwickeln einer UDF mit verwaltetem Code.

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using Microsoft.Office.Excel.Server.Udf;
using ZipCodes.com.imacination.webservices;

namespace ZipCodeUdfSample
{
    [UdfClass]
    public class ZipCodeUdfs
    {
        DistanceService distanceService = null;

        public ZipCodeUdfs()
        {
            this.distanceService = new DistanceService();
            //this.distanceService.Proxy = new WebProxy("http://myproxy:80", true);
        }

        [UdfMethod]
        public double GetDistanceBetweenTwoZipCodes(int zip1, int zip2)
        {
            string zip1String = Convert.ToString(zip1);
            string zip2String = Convert.ToString(zip2);

            return (distanceService.getDistance(zip1String, zip2String));
        }

        [UdfMethod]
        public string GetCityFromZip(int zip)
        {
            string zipString = Convert.ToString(zip);

            return (distanceService.getCity(zipString));
        }

        [UdfMethod]
        public string GetStateFromZip(int zip)
        {
            string zipString = Convert.ToString(zip);

            return (distanceService.getState(zipString));
        }

        [UdfMethod]
        public string GetLocationFromZip(int zip)
        {
            string zipString = Convert.ToString(zip);

            return (distanceService.getLocation(zipString));
        }

        [UdfMethod]
        public double GetLatitudeFromZip(int zip)
        {
            string zipString = Convert.ToString(zip);

            return (distanceService.getLatitude(zipString));
        }

        [UdfMethod]
        public double GetLongitudeFromZip(int zip)
        {
            string zipString = Convert.ToString(zip);

            return (distanceService.getLongitude(zipString));
        }

        [UdfMethod]
        public string ToDegreeNotation(double angle)
        {
            int deg = (int)angle;
            double minutesAndSeconds = Math.Abs(angle - deg) * 60;
            int minutes = (int)minutesAndSeconds;
            int seconds = (int)(Math.Abs(minutesAndSeconds - minutes) * 60);

            return deg.ToString() + "°" + minutes.ToString() + "\'" + seconds.ToString() + "\"";
        }
    }
}
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Net
Imports Microsoft.Office.Excel.Server.Udf
Imports ZipCodes.com.imacination.webservices

Namespace ZipCodeUdfSample
    <UdfClass> _
    Public Class ZipCodeUdfs
        Private distanceService As DistanceService = Nothing

        Public Sub New()
            Me.distanceService = New DistanceService()
            'this.distanceService.Proxy = new WebProxy("http://myproxy:80", true);
        End Sub

        <UdfMethod> _
        Public Function GetDistanceBetweenTwoZipCodes(ByVal zip1 As Integer, ByVal zip2 As Integer) As Double
            Dim zip1String As String = Convert.ToString(zip1)
            Dim zip2String As String = Convert.ToString(zip2)

            Return (distanceService.getDistance(zip1String, zip2String))
        End Function

        <UdfMethod> _
        Public Function GetCityFromZip(ByVal zip As Integer) As String
            Dim zipString As String = Convert.ToString(zip)

            Return (distanceService.getCity(zipString))
        End Function

        <UdfMethod> _
        Public Function GetStateFromZip(ByVal zip As Integer) As String
            Dim zipString As String = Convert.ToString(zip)

            Return (distanceService.getState(zipString))
        End Function

        <UdfMethod> _
        Public Function GetLocationFromZip(ByVal zip As Integer) As String
            Dim zipString As String = Convert.ToString(zip)

            Return (distanceService.getLocation(zipString))
        End Function

        <UdfMethod> _
        Public Function GetLatitudeFromZip(ByVal zip As Integer) As Double
            Dim zipString As String = Convert.ToString(zip)

            Return (distanceService.getLatitude(zipString))
        End Function

        <UdfMethod> _
        Public Function GetLongitudeFromZip(ByVal zip As Integer) As Double
            Dim zipString As String = Convert.ToString(zip)

            Return (distanceService.getLongitude(zipString))
        End Function

        <UdfMethod> _
        Public Function ToDegreeNotation(ByVal angle As Double) As String
            Dim deg As Integer = CInt(Fix(angle))
            Dim minutesAndSeconds As Double = Math.Abs(angle - deg) * 60
            Dim minutes As Integer = CInt(Fix(minutesAndSeconds))
            Dim seconds As Integer = CInt(Fix(Math.Abs(minutesAndSeconds - minutes) * 60))

            Return deg.ToString() & "°" & minutes.ToString() & "'" & seconds.ToString() & """"
        End Function
    End Class
End Namespace

Siehe auch

Aufgaben

Schritt 2: Hinzufügen eines Webverweises

Schritt 3: Zugreifen auf den Webdienst

Schritt 1: Erstellen eines Projekts und Hinzufügen eines UDF-Verweises

Schritt 2: Erstellen von UDFs mit verwaltetem Code

Schritt 3: Bereitstellen und Aktivieren von UDF-Dateien

Schritt 4: Testen und Aufrufen von UDFs aus Zellen

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

Konzepte

Zugreifen auf die SOAP-API