Hola,
Vereis, tengo un problema. He creado un WebService muy simple que por medio
de cabeceras soap le paso un usuario y password, y por parámetro del
webservice le indico un saludo. La cuestión es que el webservice recoge este
parámetro y lo introduce en un dataset que es retornado a la aplicación
winforms que la consume.
La aplicación Winforms, una vez recibe el dataset realiza un writexml a un
fichero.
El problema es que cuando consulto este fichero, el esquema que me aparece
no es soap. El código que uso en el webservice es el siguiente:
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Data;
public class LogInfo : SoapHeader
{
public string Username;
public string Password;
}
[WebService(Namespace = "
http://www.mynamespace.domain/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WSEtiquetas : System.Web.Services.WebService
{
public WSEtiquetas () {
//Eliminar la marca de comentario de la línea siguiente si utiliza
los componentes diseñados
//InitializeComponent();
}
public LogInfo sSoapHeader;
[WebMethod]
[SoapHeader("sSoapHeader")]
public DataSet HelloWorld(string sMensaje) {
DataSet ds = new DataSet();
DataTable dt = new DataTable();
dt.Columns.Add("Mensaje");
dt.Columns.Add("Warnning");
DataRow dr = dt.NewRow();
dr[0] = sMensaje;
dr[1] = "Error";
if (sSoapHeader == null)
{
dr[0] = sSoapHeader.Username;
dr[1] = sSoapHeader.Password;
}
dt.Rows.Add(dr);
ds.Tables.Add(dt);
return ds;
}
}
Y la aplicación windows:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace ConsumidorWS
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
WS.WSEtiquetas WSE = new ConsumidorWS.WS.WSEtiquetas();
WS.LogInfo LogI = new ConsumidorWS.WS.LogInfo();
LogI.Username = "UName";
LogI.Password = "PSW";
WSE.LogInfoValue = LogI;
WSE.SoapVersion =
System.Web.Services.Protocols.SoapProtocolVersion.Soap12;
DataSet ds = WSE.HelloWorld("Hola Mundo");
ds.WriteXml("C:\\hola.xml",XmlWriteMode.WriteSchema);
}
}
}
El esquema resultante en el fichero es:
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<xs:schema id="NewDataSet" xmlns=""
xmlns:xs="
http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true"
msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Table1">
<xs:complexType>
<xs:sequence>
<xs:element name="Mensaje" type="xs:string" minOccurs="0" />
<xs:element name="Warnning" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<Table1>
<Mensaje>Hola Mundo</Mensaje>
<Warnning>Error</Warnning>
</Table1>
</NewDataSet>
Cuando debería ser algo como:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="
http://www.w3.org/2001/XMLSchema"
xmlns:soap="
http://schemas.xmlsoap.org/soap/env...">
<soap:Header>
<LogInfo xmlns="
http://www.mynamespace.domain/">
<Username>UName</Username>
<Password>PWD</Password>
</LogInfo>
</soap:Header>
<soap:Body>
...
o eso creo.
Gracias y espero no haberme enrollado demasiado.
Leer las respuestas