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.
Hinweis |
---|
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