Compartir a través de


Procedimiento para crear una UDF que llame a un servicio web

Última modificación: jueves, 21 de enero de 2010

Hace referencia a: SharePoint Server 2010

En este ejemplo se muestra cómo llamar a un servicio web externo desde una función definida por el usuario (UDF). El servicio web usado en este ejemplo es:

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

Debe usar Microsoft Visual Studio 2005 o una herramienta de desarrollo similar compatible con Microsoft .NET Framework 2.0 para crear este ejemplo.

Nota

Antes de probar el código, asegúrese de que el servicio web al que llama está disponible. Es posible que el servidor del servicio web esté inactivo o que el servicio web ya no se ofrezca. Si el servicio web no está disponible, las llamadas que se hagan al mismo desde el código tendrán errores.

Para comprobar si un servicio web está disponible, visite su sitio. En este ejemplo, la dirección URL es:

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

Si el servicio web está disponible, podrá ver el Lenguaje de descripción de servicios web (WSDL). Si no lo está, verá el error habitual que indica que no se encontró la página web.

Ejemplo

Para obtener más información acerca del servicio web usado en este ejemplo, examine su código WSDL.

Un servicio que proporciona es devolver las coordenadas geográficas en formato decimal. En este ejemplo, se ha agregado la función ToDegreeNotation para mostrarle cómo puede convertir coordenadas en grados, minutos y segundos, lo cual resulta más adecuado para mostrar coordenadas.

[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

Si la configuración de LAN de Internet Explorer usa un servidor proxy, el código debe realizar una llamada de forma explícita para establecer el servidor proxy. De lo contrario, las llamadas al servicio web tendrán errores. Puede establecer el servidor proxy en el constructor de la siguiente forma:

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

Para obtener más información acerca de cómo probar y llamar a UDF desde celdas, consulte Tutorial: Desarrollo de una UDF de código administrado.

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

Vea también

Tareas

Paso 2: Agregar una referencia web

Paso 3: acceso al servicio web

Paso 1: Crear un proyecto y agregar una referencia de UDF

Paso 2: Crear una UDF de código administrado

Paso 3: Implementar y habilitar UDF

Paso 4: pruebas y llamadas a UDF desde las celdas

Tutorial: Desarrollar una aplicación personalizada mediante Excel Web Services

Conceptos

Obtener acceso a la API de SOAP