Im vorhergehenden Post habe ich gezeigt, wie ich die Klasse SoapAuthHeader in einem XML Webdienst verwende. In diesem Eintrag wende ich mich der Clientseite zu. Im VWD ist es nun einfach einen Webdienst-Proxy zu erstellen. Da eine Instanz der Klasse SoapAuthHeader im Webdienst vorhanden ist wird bei der Proxyerzeugung die Eigenschaft SoapAuthHeaderValue zur Verfügung gestellt, der eine Instanz der Klasse SoapAuthHeader übergeben werden kann.

// Hält die SoapAuthHeader Klasse
private SoapAuthHeader soapAuthHeaderValueField;

public SoapAuthHeader SoapAuthHeaderValue
{
	get
	{
		return this.soapAuthHeaderValueField;
	}
	set
	{
		this.soapAuthHeaderValueField = value;
	}
}

Genau wie im Webdienst, wird auch auf die Methoden der erzeugten Proxyklasse das SoapHeader-Attribut angewandt.

[SoapHeaderAttribute("SoapAuthHeaderValue", Direction = SoapHeaderDirection.InOut)]
[SoapDocumentMethodAttribute("http://DataCenter.NeBuSa-NET.local/webServices/downPath",
	RequestNamespace = "http://DataCenter.NeBuSa-NET.local/webServices/",
	ResponseNamespace = "http://DataCenter.NeBuSa-NET.local/webServices/",
	Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
[return: XmlElementAttribute("DownloadPath")]
public string downPath(int RowNumber)
{
	object[] results = this.Invoke("downPath", new object[]{ RowNumber });
	return ((string)(results[0]));
}

Alles was jetzt noch zu tun bleibt ist das erzeugen einer Instanz der SoapAuthHeader-Klasse und das zuweisen der benötigten Werte. Das folgende Beispiel ist der Auszug aus einer ASP.NET Seite.

public partial class Download : Page
{
	// private Objekte initialisieren
	private DataSet ds;
	private GetDcProxy dcProxy = new GetDcProxy();
	private string downPath = string.Empty;

	/// <summary>
	/// liefert die benötigten Daten mittels asynchroner Aufrufe
	/// verschiedener WebMethoden
	/// </summary>
	/// <param name="ID">die ID der benötigten Datenbank-Reihe</param>
	protected void getData(int ID)
	{
	    // zueisen der Werte an eine SoapAuthHeader-Instanz
	    SoapAuthHeader authHeader = new SoapAuthHeader();
	    authHeader.Created = DateTime.Now;
	    authHeader.Expires = 6;
	    authHeader.IsEditMode = false;
	    authHeader.HashValue = Fingerprint.CreateHash(new object[] {
	        authHeader.Created, authHeader.Expires, authHeader.IsEditMode });
	    // übergeben der SoapAuthHeader-Instanz an den WS-Proxy
	    dcProxy.SoapAuthHeaderValue = authHeader;

	    // ServerPfad zu den Downloads
	    srvPath = ConfigurationManager.AppSettings["downSrvPath"].ToString();

	    // Werte vom WebService asynchron holen
	    IAsyncResult aDownPath = dcProxy.BegindownPath(ID, null, null);
	    ...

	    // asynchrone Verarbeitung abwarten
	    aDownPath.AsyncWaitHandle.WaitOne();
	    ...

	    // Daten an Variablen übergeben
	    downPath = dcProxy.EnddownPath(aDownPath);
	    
        // ...

	}
}

Zur Erzeugung des Hash-Wert aus den einzelnen Objekten verwende ich die statische Methode CreateHash aus der Klasse Fingerprint. Dies ist eine meiner eigenen Klassen und nicht im .NET Framework vorhanden. Die Methode erwartet ein Array von Objekten und benutzt eine Überladung der Concat Methode aus der String-Klasse um die so erzeugte Zeichenfolge in ein Byte-Array zu konvertieren und daraus einen SHA256 Hash-Wert zu erzeugen. Doch das sollte ein anderes Thema sein.

Technorati-Tags:  | 
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitte "kicken" sie ihn.
kick it on dotnet-kicks.de