Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción a .NET
IntroduccionNET.qxd 17/3/10 13:30 Página 2
IntroduccionNET.qxd 17/3/10 15:46 Página 3
Introducción
a .NET
© Jordi Ceballos Villach, David Gañán Jiménez, Jordi Conesa Caralt y Àngels Rius
Gavidia, del texto
ISBN: 978-84-9788-875-2
Depósito legal B.
Coordinadores
Autores
Agradecimientos
Índice
Introducción ................................................................ 13
1. Introducción .......................................................... 15
2. Visual Studio .......................................................... 20
3. Arquitectura de .NET .............................................. 22
1. Introducción .......................................................... 25
2. Sintaxis de C# ........................................................ 27
3. Programación orientada a objetos con C# ............ 38
4. Gestión de excepciones .......................................... 47
1. Introducción .......................................................... 61
2. Conexión con la fuente de datos .......................... 65
3. Acceso conectado.................................................... 67
4. Acceso desconectado .............................................. 72
5. LINQ ...................................................................... 78
1. Introducción .......................................................... 85
2. Controles ................................................................ 93
1. Introducción .......................................................... 99
2. Controles ................................................................ 105
3. AJAX ........................................................................ 109
Introducción
Capítulo I
La plataforma .NET
1. Introducción
Evolución de .NET
2. Visual Studio
3. Arquitectura de .NET
Compilación y MSIL
Ensamblados
Capítulo II
El lenguaje C#
1. Introducción
namespace HolaMundo
{
class HolaMundo
{
static void Main(string[] args)
{
Console.WriteLine ("Hola Mundo");
}
}
}
IntroduccionNET.qxd 17/3/10 13:30 Página 26
Tipo Descripción
Tipos referencia
Los tipos referencia nos permiten acceder a los objetos
(clases, interfaces, arrays, strings, etc.). Los objetos se almace-
nan en la memoria heap del sistema, y accedemos a ellos a
través de una referencia (un puntero). Estos tipos tienen un
rendimiento menor que los tipos valor, ya que el acceso a los
objetos requiere de un acceso adicional a la memoria heap.
2. Sintaxis de C#
Case sensitive
Declaración de variables
Constantes
const int i = 4;
Arrays
Comentarios
Visibilidad
Ejemplo:
class Prueba {
public int cantidad;
private bool visible;
}
Operadores
Enumeraciones
enum DiaSemana
{
Lunes, Martes, Miercoles, Jueves, Viernes, Sabado,
Domingo
}
Estructuras
struct Punto
{
int x;
int Y;
bool visible;
}
Punto p;
p.x = 0;
p.y = 0;
IntroduccionNET.qxd 17/3/10 13:30 Página 32
Control de flujo
if
Sentencia condicional. Un ejemplo típico sería el siguiente:
if (x <= 10)
{
// Sentencias a ejecutar si la condición es cierta
}
else
{
// Sentencias a ejecutar si la condición es falsa
}
switch
La instrucción switch s una forma específica de instruc-
ción condicional, en la que se evalúa una variable, y en fun-
ción de su valor, se ejecuta un bloque u otro de instrucciones.
Ejemplo:
switch (var)
{
case 1: // sentencias a ejecutar si es 1
break;
for
Permite ejecutar un bloque de código un cierto número de
veces. El siguiente ejemplo ejecuta el bloque de instrucciones
10 veces:
while
El siguiente ejemplo es equivalente al anterior del for:
int i = 0;
while (i<10)
{
// sentencias a ejecutar
i++;
}
do-while
Igual que el anterior, excepto que la condición se evalúa al
final. La diferencia fundamental es que, mientras que en un
bucle for o while, si la condición es falsa de entrada, no se
ejecuta ninguna iteración, en un bucle do-while siempre se
ejecuta como mínimo una iteración.
do
{
// sentencias a ejecutar
}
while (condición);
foreach
Permite recorrer todos los elementos de una colección
desde el primero al último. La sintaxis es la siguiente:
IntroduccionNET.qxd 17/3/10 13:30 Página 34
Paso de parámetros
Parámetros de salida
Sobrecarga de métodos
Definición de clases
class MiClase
{
public int valor; // Miembro de datos
Objetos
MiClase obj;
obj = new MiClase ();
obj.valor = 3;
Propiedades
}
}
}
Construcción de objetos
class MiClase
{
public int valor;
public MiClase()
{
valor = 0;
}
public MiClase(int valor)
{
this.valor = valor;
}
}
Destrucción de objetos
~MiClase()
{
Console.WriteLine("El objeto ha sido destruido");
}
Métodos estáticos
Herencia
Interfaces
Sobrescritura de métodos
class Persona
{
String nombre;
public Persona(String nombre)
{
this.nombre = nombre;
}
public override string ToString()
{
return nombre;
}
}
class Program
{
IntroduccionNET.qxd 17/3/10 13:30 Página 46
Genéricos
4. Gestión de excepciones
}
catch (IndexOutOfRangeException)
{
Console.WriteLine("Índice fuera de rango");
}
catch (Exception ex)
{
Console.WriteLine("Error desconocido: " +
ex.Message);
}
finally
{
Console.WriteLine("Aquí haríamos la limpieza.");
}
Capítulo III
.NET Framework
1. Clases básicas
System.Object
System.Convert
double d = 4.7;
int i = Convert.ToInt32(d);
System.Math
1. Una tabla de hash es una tabla en la que cada elemento esta identificado
por una clave. Los elementos se insertan y se recuperan utilizando la clave
correspondiente como referencia.
IntroduccionNET.qxd 17/3/10 13:30 Página 53
System.Random
System.String
System.DateTime
System.Array
System.Environment
2. Colecciones de datos
3. Entrada / Salida
Capítulo IV
ADO.NET
1. Introducción
Características de ADO.NET
Proveedores de datos
Cadenas de conexión
3. Para distinguir las clases de unos y otros proveedores, se les añade un pre-
fijo (lo hemos nombrado xxx), que en SQL Server es Sql, y en OLEDB es
OleDb.
IntroduccionNET.qxd 17/3/10 13:30 Página 67
3. Acceso conectado
int? i = dr.GetInt32(3);
Procedimientos almacenados
4. Los tipos anulables son una extensión de los tipos valor de .NET, y permi-
ten que el tipo de datos pueda contener también el valor null. Para indi-
car que un tipo es anulable, añadimos un ? junto al tipo de datos.
IntroduccionNET.qxd 17/3/10 13:30 Página 71
Transacciones
try
{
command1.ExecuteNonQuery();
command2.ExecuteNonQuery();
tran.Commit();
}
catch (SqlException)
{
tran.Rollback();
}
finally
{
conn.Close();
}
4. Acceso desconectado
Datasets no tipados
Datasets tipados
La clase DataAdapter
da.Fill(ds, "CLIENTES");
Problemas de Concurrencia
El uso de DataSets en una base de datos a la que acceden
múltiples usuarios añade el problema de la gestión de la con-
currencia. Mientras un usuario está trabajando con los datos
en una copia local, se puede producir una actualización de
éstos en la fuente de datos real, pudiendo invalidar los datos
que leímos, cuando todavía estamos trabajando con ellos. En
general, existen varias técnicas de gestión de concurrencia:
• Concurrencia pesimista: Cuando una fila es leída, ésta
queda bloqueada para su lectura para cualquier otro que
la demande, hasta que aquél que la posee la libere.
• Concurrencia optimista: La filas están disponibles para
su lectura en todo momento, estas pueden ser leídas por
distintos usuarios al mismo tiempo. Cuando alguno
intenta modificar una fila que ya fue modificada se pro-
duce un error y no se produce la modificación.
• ‘Last win’: técnica implica que no existe control alguno,
simplemente la última actualización es la que permanece.
La clase DataView
5. LINQ
LINQ to Objects
Permite realizar consultas sobre colecciones de objetos. Es el
que utilizaremos en todos los ejemplos de este subapartado.
LINQ to XML
Permite realizar consultas sobre datos en formato XML.
LINQ to ADO.NET
Permite consultar bases de datos a través de ADO.NET.
Existen tres variantes:
• LINQ to SQL: Permite hacer consultas sobre bases de datos
relacionales, aunque inicialmente sólo con SQL Server.
• LINQ to DataSet: Permite realizar consultas sobre
DataSets.
• LINQ to Entities: Permite realizar consultas sobre un
modelo conceptual de datos. Está relacionado con
ADO.NET Entity Framework, que permite trabajar con-
tra un modelo conceptual de datos, sin preocuparse de
la estructura real de la base de datos.
Sintaxis de LINQ
var personas_BCN =
from p in personas
where (p.Ciudad == "Barcelona")
orderby p.Edad descending, p.Nombre
select (p);
from
Indica la fuente de información sobre la que se va a ejecu-
tar la consulta.
where
Permite especificar las restricciones o filtros a aplicar a los
datos.
select
Indica los campos a devolver en el resultado.
IntroduccionNET.qxd 17/3/10 13:30 Página 81
orderby
Permite ordenar los resultados por uno o varios criterios
de ordenación, y podemos indicar el orden como ascending
(por defecto) o descending.
group by
Ciudad: Barcelona
Cont: 2
Juan
Rosa
Ciudad: Londres
Cont: 1
Pedro
Ciudad: Lisboa
Cont: 1
Maria
IntroduccionNET.qxd 17/3/10 13:30 Página 82
join
El operador join permite definir una relación entre dos
clases o entidades dentro de la consulta. Su semántica es
similar a la del join de SQL, ya que lo que hace es cruzar
ambas tablas (o clases) en función de la expresión de enlace
especificada.
A continuación, se muestra un ejemplo en el que se utili-
za la instrucción join para combinar las personas con las
ciudades, y obtener un listado con el nombre de la persona,
su ciudad, y el país:
var listado =
from p in personas
join c in ciudades
on p.Ciudad equals c.Nombre
select new {p.Nombre, p.Ciudad, c.Pais};
Agregados
Los agregados son métodos que devuelven el resultado de
realizar una determinada operación sobre los elementos de la
lista de valores sobre la que se aplica. A continuación se indi-
ca la utilidad de cada uno de ellos:
Capítulo V
Windows Forms
1. Introducción
Delegados
class Program
{
public delegate int MiDelegado(int valor1, int
valor2);
2. Controles
Contenedores
Controles
Componentes
Diálogos
Capítulo VI
ASP.NET
1. Introducción
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Primera prueba</title>
</head>
<body>
IntroduccionNET.qxd 17/3/10 13:30 Página 102
Button1.Visible = false;
Label1.Text = "HOLA!";
}
}
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Primera prueba</title>
</head>
<body>
<form id="form1" method="post" action="WebForm1.aspx">
<input type="hidden" id="__VIEWSTATE" value="..." />
<span id="Label1">HOLA!</span>
</form>
</body>
</html>
2. Controles
Controles estándar
Controles de datos
Controles de validación
Controles de login
Controles de navegación
Controles HTML
Controles de usuario
3. AJAX
Introducción a AJAX
http://www.asp.net/ajax/ajaxcontroltoolkit
Capítulo VII
WPF
1. Introducción
Características
Herramientas de desarrollo
XAML
Window
<Window x:Class="Layout.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/p
resentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml
"
Title="Window1" Height="300" Width="300">
<!-- Contenido de la ventana -->
</Window>
Controles contenedores
Grid
El Grid es un contenedor muy flexible en cuanto a la orga-
nización de los controles, ya que permite definir varias filas y
columnas en forma de tabla, donde posteriormente se ubican
los diferentes controles.
IntroduccionNET.qxd 17/3/10 13:30 Página 121
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="2*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Name="Button1" Content="Boton1" Grid.Row="0"
Grid.Column="0" Background="LightBlue"/>
<Button Name="Button2" Content="Boton2" Grid.Row="0"
Grid.Column="1" Background="LightCoral"
Grid.RowSpan="2"/>
<Button Name="Button3" Content="Boton3" Grid.Row="1"
Grid.Column="0" Background="LightSalmon"/>
</Grid>
Canvas
En un panel de tipo Canvas los controles se sitúan en rela-
ción a su distancia con alguna de las esquinas del panel.
Veamos un ejemplo:
<Canvas Name="canvas1">
<Button Canvas.Left="30" Canvas.Top="10"
Background="Red" Width="60">1</Button>
<Button Canvas.Left="110" Canvas.Bottom="10"
Background="LightBlue" Width="60">2</Button>
<Button Canvas.Right="30" Canvas.Top="10"
Background="Orange" Width="60">3</Button>
</Canvas>
StackPanel
El panel StackPanel distribuye los controles ubicados en
su interior en forma de pila, secuencialmente. El siguiente
ejemplo utiliza un StackPanel para distribuir diferentes
botones:
ScrollViewer
El control ScrollViewer no es un panel en sí, pero se puede
combinar con un panel para añadir la funcionalidad de
barras de desplazamiento a los componentes que contiene.
El control ScrollViewer puede utilizarse no sólo con pane-
les sino también con otros controles, por ejemplo el siguien-
te código utiliza un ScrollViewer para hacer scroll de una ima-
gen:
IntroduccionNET.qxd 17/3/10 13:30 Página 124
<ScrollViewer HorizontalScrollBarVisibility="Auto">
<Image Source="flor_almendro.jpg"/>
</ScrollViewer>
Eventos
El WPF todos los controles disponen de un evento Loaded,
que corresponde a cuando el control ha sido inicializado y
está listo para ser renderizado. Un evento muy utilizado es el
Window_Loaded, ya que es el evento que aparece por defec-
to al pulsar sobre el fondo de una ventana en Visual Studio:
<Window>
<Grid>
<Label>
</Label>
</Grid>
</Window>
IntroduccionNET.qxd 17/3/10 13:30 Página 125
<Window Name="window1"
PreviewMouseDown="GenericRoutedEventHandler"
MouseDown="GenericRoutedEventHandler">
<Grid Name="grid1"
PreviewMouseDown="GenericRoutedEventHandler"
MouseDown="GenericRoutedEventHandler">
MouseDown="GenericRoutedEventHandler">
</Label>
</Grid>
</Window>
2. Controles
<ListBox Name="listBox1">
<ListBoxItem>Elemento 1</ListBoxItem>
<ListBoxItem>Elemento 2</ListBoxItem>
<ListBoxItem>Elemento 3</ListBoxItem>
<ListBoxItem>Elemento 4</ListBoxItem>
</ListBox>
<Expander Header="Opciones">
<StackPanel>
<CheckBox>Opción 1</CheckBox>
<CheckBox>Opción 2</CheckBox>
<CheckBox>Opción 3</CheckBox>
</StackPanel>
</Expander>
<TabControl>
<TabItem Header="Tab 1">Este es el tab 1</TabItem>
<TabItem Header="Tab 2">Este es el tab 2</TabItem>
<TabItem Header="Tab 3">Este es el tab 3</TabItem>
</TabControl>
<ToolBarTray VerticalAlignment="Top">
<ToolBar Name="toolBar1">
<Button>Accion1</Button>
<Separator/>
<Button>Accion2</Button>
<ComboBox Width="100">
<ComboBoxItem>Opcion1</ComboBoxItem>
<ComboBoxItem>Opcion2</ComboBoxItem>
<ComboBoxItem>Opcion3</ComboBoxItem>
</ComboBox>
</ToolBar>
</ToolBarTray>
Transformaciones
RotateTransform
Permite rotar un elemento de la interfaz en un ángulo
determinado. El siguiente ejemplo muestra cómo rotar un
botón 25 grados a la derecha:
<StackPanel Width="134">
<Button Background="Red" Height="50" Width="100"> 1
</Button>
<Button Background="Orange" Height="50" Width="100">
2
<Button.RenderTransform>
<RotateTransform Angle="25" />
</Button.RenderTransform>
</Button>
<Button Background="Yellow" Width="100" Height="50">
3
</Button>
</StackPanel>
IntroduccionNET.qxd 17/3/10 13:30 Página 134
TranslateTransform
Permite trasladar un elemento siguiendo un cierto vector
de traslación, indicado mediante las propiedades X e Y de la
clase TranslateTransform. Con el siguiente código traslada-
mos el botón central del ejemplo anterior:
ScaleTransform
Permite escalar un elemento en una cierta proporción
determinada por:
TransformGroup
Permite combinar múltiples transformaciones sobre un
elemento, que tienen lugar según el orden en el que se han
añadido al TransformGroup. El siguiente ejemplo aplica una
rotación y a continuación una translación:
Animaciones
Audio y video
System.Media.SoundPlayer sp;
sp = new System.Media.SoundPlayer("sonido.wav");
sp.Play();
WPF Browser
Silverlight
Capítulo VIII
Windows Mobile
1. Introducción
Dispositivos
Sistemas operativos
Herramientas de desarrollo
Formularios WinForms
Pocket PC
El dispositivo Pocket PC permite interactuar con las apli-
caciones mediante un lápiz digital utilizado a modo de ratón,
por lo que la entrada de datos se produce mediante un tecla-
do mostrado en pantalla o utilizando un componente de
reconocimiento de caracteres.
En la parte superior de la ventana hay una barra de estado
con el título de la ventana y una serie de iconos de notifica-
ción, indicando parámetros como el volumen, la hora o la
cantidad de batería disponible. A la derecha del todo, hay un
icono que permite ocultar la ventana. Este icono es configu-
IntroduccionNET.qxd 17/3/10 13:30 Página 150
SmartPhone
Los dispositivos SmartPhone normalmente no disponen
de pantalla táctil, por lo que la interacción con el usuario se
realiza mediante los botones del teléfono. En la parte superior
de la ventana aparece también una barra de información con
el título de la ventana y algunos iconos que indican por
ejemplo el estado de la batería y la cobertura. Sin embargo,
esta barra de información no tiene icono para cerrar la ven-
tana, ésta puede cerrarse al pulsar la tecla de inicio o la tecla
de cancelar, aunque solamente se minimiza porque sigue eje-
cutándose en segundo plano. Para cerrar la aplicación es
necesario añadir una opción adicional en el programa, por
ejemplo una opción de menú.
Cuadros de diálogo
Los cuadros de diálogo son también formularios, aunque
se utilizan puntualmente para mostrar un mensaje al usuario
o pedirle que seleccione o introduzca un determinado dato.
Dentro del namespace de WinForms existen algunos cuadros
de diálogo predefinidos que permiten realizar tareas comu-
nes.
Despliegue de aplicaciones
Capítulo IX
1. Introducción
http://msdn.microsoft.com/en-us/library/ms951274.aspx
2. Elementos de WCF
Mensajes
Programas WCF
Simplex (o one-way)
En un patrón one-way la comunicación se produce del
cliente al servicio, y no existe una respuesta por parte del ser-
vicio:
Envío-respuesta (Request-reply)
Este patrón es análogo al anterior, pero en este caso el ser-
vicio sí que devuelve una respuesta al cliente:
Duplex
Finalmente el patrón dúplex permite comunicaciones en
ambos sentidos, tanto cliente-servidor, como servidor-clien-
te. Las comunicaciones además pueden ser tanto one-way
como request-reply:
Canales (Channels)
Endpoints
Direcciones (Addresses)
http://myserver.com/myService1
https://ahost.net/SecuredService
net.tcp://localhost/TCPService
Binding (Enlaces)
Contratos
Contratos de servicio
Un contrato de este tipo se utiliza para definir las distintas
operaciones que proporciona un servicio, así como otros
detalles del servicio que veremos más adelante. Los contratos
de servicio se implementan mediante una interfaz con el atri-
buto ServiceContract:
[ServiceContract]
interface ServicioWCF
{
// Operaciones del servicio
}
Contratos de operación
Dentro de un contrato de servicio se definen las funciona-
lidades que éste ofrece utilizando definiciones de métodos
con el atributo OperationContract:
[OperationContract]
void Operacion1(string parametro1);
[OperationContract]
int Operacion2();
Contratos de datos
Los tipos de los parámetros de una operación de servicio,
así como su tipo de retorno, deben de ser tipos serializables.
WCF utiliza un serializador específico que serializa tipos de
datos que están definidos mediante un contrato de datos.
La mayoría de tipos comunes de .NET son serializables de
entrada. Para los tipos personalizados es necesario crear un
contrato de datos utilizando los atributos DataContract y
DataMember. Estos atributos se encuentran dentro del
namespace System.Runtime.Serialization (es necesario
añadir una referencia al ensamblado System.Runtime.
Serialization.dll):
[DataContract]
public class Datos
{
[DataMember]
public int campo1;
[DataMember]
private string campo2;
}
http://msdn2.microsoft.com/en-us/library/ms733127.aspx
IntroduccionNET.qxd 17/3/10 13:30 Página 165
Contratos de mensaje
Los contratos de mensaje definen con mayor precisión el
esquema de los mensajes SOAP. Estos contratos se definen
mediante los atributos MessageContract, MessageHeader
y MessageBodyMember.
El atributo MessageContract se aplica sobre una clase
que define la estructura del mensaje. Los miembros de dicha
clase marcados con MessageHeader se incluyen dentro de la
cabecera del mensaje, mientras que los marcados con
MessageBodyMember se incluyen en el cuerpo del mismo:
[MessageContract]
public class MensajeSOAPPersonalizado
{
[MessageHeader]
public string cabeceraMensaje;
[MessageBodyMember]
public string cuerpoMensaje;
}
http://msdn2.microsoft.com/en-us/library/ms730255.aspx
Contratos de fallo
Los contratos de fallo especifican los posibles errores que
se pueden producir durante la ejecución de una operación
del servicio:
[OperationContract]
[FaultContract(typeof(ClaseError))]
void Operacion3();
IntroduccionNET.qxd 17/3/10 13:30 Página 166
Behaviors (Comportamiento)
Behavior Descripción
Throttling (regulación) determina el número de threads, instancias
del servicio y mensajes que puede procesar
concurrentemente en un momento dado.
[ServiceContract(Namespace="http://MyFirstService")]
interface IServicio
{
[OperationContract]
public int Metodo1(string s);
[OperationContractAttribute(IsOneWay=true)]
public void Method2(string s);
interface IDuplexCallback
{
[OperationContract (IsOneWay=true)]
void CallbackMethod1(string s);
[OperationContract]
string CallbackMethod2(int i);
}
[ServiceContract (CallbackContract=typeof(IDuplexCallba
ck),
Namespace="http://MyFirstService")]
interface IServicio
{
// Operaciones del servicio
}
IntroduccionNET.qxd 17/3/10 13:30 Página 171
var callback =
OperationContext.Current
.GetCallbackChannel<IDuplexCallback>();
var s = callback.CallbackMethod2(4);
4. Hosting de servicios
Self-hosting
string httpBaseAddress =
ConfigurationManager.AppSettings["httpBase
Address"];
string tcpBaseAddress =
ConfigurationManager.AppSettings["tcpBaseAddress"];
host.Open();
host.Close();
host.AddServiceEndpoint(typeof(IServicio),
binding, "Servicio");
<system.serviceModel>
<services>
<service name="MiServicio.Servicio">
<endpoint
contract="MiServicio.IServicio"
binding="basicHttpBinding"
address="Servicio" />
</service>
</services>
</system.serviceModel>
<system.serviceModel>
<bindings> </bindings>
<services> </services>
<behaviors> </behaviors>
</system.serviceModel>
<system.serviceModel>
<services>
<service name="MiServicio.Servicio">
<endpoint contract="MiServicio.IServicio"
binding="basicHttpBinding"
bindingConfiguration="HttpSeguro"
address="Servicio" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name ="HttpSeguro">
<security mode ="Transport"></security>
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
[ServiceBehavior(
ConcurrencyMode=ConcurrencyMode.Multiple,
InstanceContextMode=InstanceContextMode.PerCall,
TransactionIsolationLevel=IsolationLevel.Serializable
)]
public class Servicio : IServicio
{
[OperationBehavior(TransactionScopeRequired=true)]
public void Operacion1(string parametro1)
{
}
}
ServiceThrottlingBehavior bt =
new ServiceThrottling Behavior();
bt.MaxConcurrentCalls = 16;
bt.MaxConcurrentInstances = 8;
bt.MaxConcurrentSessions = 16;
host.Description.Behaviors.Add(bt);
<behaviors>
<serviceBehaviors>
<behavior name="ServicioBehavior" >
<serviceMetadata httpGetEnabled="true" />
<serviceThrottling maxConcurrentCalls="4"/>
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Windows"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="EndpointBehavior">
<clientCredentials supportInteractive="True">
<windows allowNtlm="True"/>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name="MiServicio.Servicio"
behaviorConfiguration="ServicioBehavior">
<endpoint contract="MiServicio.IServicio"
binding="basicHttpBinding"
behaviorConfiguration="EndpointBehavior"
address="Servicio" />
</service>
</services>
http://msdn2.microsoft.com/en-us/library/ms752246.aspx
http://msdn2.microsoft.com/en-us/library/ms752253.aspx
IntroduccionNET.qxd 17/3/10 13:30 Página 184
ServiceReference.ServicioClient s =
new ServiceReference.ServicioClient();
s.Operacion1("parametro");
IntroduccionNET.qxd 17/3/10 13:30 Página 186
IntroduccionNET.qxd 17/3/10 13:30 Página 187
Bibliografía