Wie ich bereits in dem vergangenen Post Wie authentifiziere ich einen Client gegenüber einem Webdienst - Teil 4 angesprochen habe, ist es nicht ohne weiteres möglich einen WS-Proxy mit einem benutzerdefinierten SOAP-Header als Datenquelle für einen ObjectDataSource zu verwenden. Hier bietet sich das ObjectCreating-Ereignis an um dem ObjectDataSource mitzuteilen, dass eine spezielle Datenquelle Verwendet wird. Die MSDN sagt zum ObjectCreating-Ereignis folgendes:

Behandeln Sie ObjectCreating-Ereignis, um explizit einen anderen Konstruktor aufzurufen, und legen Sie die Instanz des resultierenden Objekts auf die ObjectInstance-Eigenschaft des zugeordneten ObjectDataSourceEventArgs-Objekts fest.

Liest sich erst mal ein wenig umständlich, ist aber in Wahrheit sehr einfach und genau dass was sich für dieses Problem anbietet.

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DeleteMethod="Delete"
        InsertMethod="Insert" SelectMethod="GetData" UpdateMethod="Update"
        OnObjectCreating="SecureProxy">.....

</asp:ObjectDataSource>

Zunächst in der ASP-Seite ein ObjectDataSource-Element erzeugen wie immer. Das ObjectCreating-Ereignis kann im Markup definiert werden. Im folgenden Beispiel wird dem ObjectCreating-Ereignis die Methode SecureProxy übergeben.

Die Signatur der SecureProxy-Methode muss so gestaltet werden, dass sie zwei Argumente entgegen nimmt. Das erste Argument ist das oft verwendete sender vom Typ Object und das zweite muss vom Typ ObjectDataSourceEventArgs sein. Besagte Methode SecureProxy macht nichts anderes, als einen Instanz der SoapAuthHeader-Klasse zu erzeugen und die Felder der soeben erzeugten Instanz mit den benötigten Werten zu füllen. Nun muss diese Instanz der SoapHeader-Klasse nur noch an die Eigenschaft ObjectInstance des ObjectDataSourceEventArg übergeben werden und das Ziel ist erreicht. Klingt vielleicht etwas verwirrend, ist im Code aber sein einfach wie folgendes Beispiel zeigt.

protected void SecureProxy(object sender, ObjectDataSourceEventArgs e)
{
    // neue Instanz der SoapAuthHeader-Klasse erzeugen
    SoapAuthHeader authHeader = new SoapAuthHeader();
    // benötigte Werte zuweissen
    authHeader.Created = DateTime.Now;
    authHeader.Expires = 5;
    authHeader.UserName = SessionFacade.CurrentUsername;
    authHeader.IsEditMode = true;
    authHeader.HashValue = Fingerprint.CreateHash(new object[] {
        authHeader.Created, authHeader.Expires,authHeader.UserName,authHeader.IsEditMode });

    // SoapAuthHeader-Instanz denm WS-Proxy übergeben
    software.SoapAuthHeaderValue = authHeader;

    // Ws-Proxy Instanz an den ObjectDataSource übergeben
    e.ObjectInstance = software;
}
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