[lang_de]

Sie haben einen Webservice (via wsdl zur Verfügung gestellt), welchen Sie aufrufen müssen? Der Betreiber des Webservice hat Basic Authentifizierung / Basic Authentification als Zugriffsmethode eingestellt. Den Webservice haben Sie via „Webverweis hinzufügen“ unter Visual Studio mit dem Namen „WebServiceName“ hinzugefügt. Die generierte Klasse MyServiceClass ist eine abgeleitete Klasse von SoapHttpClientProtocol aus dem namespace System.Web.Services.Protocols. Auf diese Klassen haben Sie bei entsprechenden via wsdl bereitgestellten Definitionen keinen Zugriff.

Leider reicht es nicht aus, wenn Sie die Zugangsdaten auf folgende Art und Weise hinzufügen:

ICredentials creds;
creds = new NetworkCredential(username, password);
WebServiceName.MyServiceClass client = new WebServiceName.MyServiceClass();
client.Credentials = creds;
client.PreAuthenticate = true;

client.MyMethodCall();

Die Lösung:

Sie müssen zusätzlich eine neue Klassendatei dem Projekt hinzufügen, welche demselben namespace wie MyServiceClass beinhaltet, z.B. WebServiceNameExtended.cs. Als nächstes erstellen Sie eine abgeleitete Klasse von MyServiceClass, z.B. MyServiceClassExtended. In diese Klasse fügen Sie eine Methode GetWebRequest() ein, welche die Standardklasse aus System.Net überschreibt. Auf diese Weise wird jeder Request, welcher abgesendet wird abgeändert und im Header die angegebenen Credentials mitgegeben und zusätzlich die Basic Authentifizierung eingeführt.

Beispiel:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Text;
using System.Web.Services.Protocols;

namespace WebServiceName
{
    public class MyServiceClassExtended : MyServiceClass
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = (WebRequest)base.GetWebRequest(address);

            if (request.PreAuthenticate)
            {
                NetworkCredential networkCredentials = request.Credentials.GetCredential(address, "Basic ");
                if (networkCredentials != null)
                {
                    byte[] credentialBuffer = new UTF8Encoding().GetBytes(networkCredentials.UserName + ":" + networkCredentials.Password);
                    request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(credentialBuffer);
                }
                else
                {
                    throw new ApplicationException("No network credentials");
                }
            }

            return request;
        }
    }
}

[/lang_de]

[lang_en]

You have a webservice (based on a wsdl), which you have to call? The owner of the webservice has set basic authentification as security requirement. You have added the webservice via „Add Web Reference“ in Visual Studio with the name „WebServiceName“. The generated class MyServiceClass is a derived class of SoapHttpClientProtocol out of namespace System.Web.Services.Protocols. You have no access to the via wsdl prompted definitions and classes.

Unfortunatly it is not sufficient to add the credentials in this way:

ICredentials creds;
creds = new NetworkCredential(username, password);
WebServiceName.MyServiceClass client = new WebServiceName.MyServiceClass();
client.Credentials = creds;
client.PreAuthenticate = true;

client.MyMethodCall();

Solution:

You have to add a new class file to your project, which contains the same namespace as MyServiceClass is a member, e.g. WebServiceNameExtended.cs. Next, you create a new dervied class of MyServiceClass in this file, e.g. MyServiceClassExtended. Into the class you insert a method called GetWebRequest(), which overrides the standard class of System.Net.
So, every Request, which is sent to the webservice will be changed and the request header will contain the credentials and will integrate Basic Authentification.

Example:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Text;
using System.Web.Services.Protocols;

namespace WebServiceName
{
    public class MyServiceClassExtended : MyServiceClass
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = (WebRequest)base.GetWebRequest(address);

            if (request.PreAuthenticate)
            {
                NetworkCredential networkCredentials = request.Credentials.GetCredential(address, "Basic ");
                if (networkCredentials != null)
                {
                    byte[] credentialBuffer = new UTF8Encoding().GetBytes(networkCredentials.UserName + ":" + networkCredentials.Password);
                    request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(credentialBuffer);
                }
                else
                {
                    throw new ApplicationException("No network credentials");
                }
            }

            return request;
        }
    }
}

[/lang_en]


0 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.