C# WS Client generálása (Web Reference Solution)

2009. augusztus 13.

Feladat: Web Logic-on futó alkalmazás által kiajánlott WS API-t kellene használnom C# kódból. A nehezítés, hogy az authentikációhoz szükséges infó (username, password, …) a SOAP messagek header-jében van átküldve.

Még egy apró probléma, hogy ehhez Visual Studio-t kell használni. Amit egyébként gyűlölök.
1. Új Project Létrehozása:
“File -> New -> Project…” Ekkor a következő dialog jelenik meg:

Legyen mondjuk egy konzolos C# alkalmazás. Adjunk neki nevet+ helyet ahová mentheti a solutiont a VS, majd nyomjunk egy OK-t. A Visual Studio gyorsan le is generál nekünk egy üres main method-ot.
2. Web Referencia hozzáadása:
Solution Explorer -> JobbKlikk a projectre -> a menüből válasszuk ki az “Add Service Reference…” menüpontot. Lásd a képen:

Itt van egy kis trükk. Ugyanis a 2008-as Visual Studio nem ajánl fel olyat, hogy Add Web Reference elsőre. Merthogy az már régi. Viszont ha egyszer sikerült hozzáadni Web Reference-et a következő módon, akkor legközelebbi jobbklikknél már beleteszi ebbe a menübe…
3. Add Service Reference dialog:

Igy néz ki:

Kattintsunk az advanced gombra.
4. Service Reference Settings panel:

Ezt nem kell nagyon bántanunk. Az alján már látható, amit kerestünk:

Katt az “Add Web Reference…” gombra.
5. Add Web Reference:
Király. Ezt kerestük. Az URL-nél meg tudjuk adni a WSDL fileunk URL-jét. A Visual Studio, gyorsan megkeresi nekünk a Serviceket és az általuk kiajánlott methodokat.

Itt adhatunk nevet is a Web Reference-nek. Ha rákattolunk az “Add Web Reference” gombra, akkor a Visual Studio legenerálja nekünk a Stub-ot. Amin mi már rendes függvényeket hívhatunk meg. Azaz hogy csak hívhatnánk. De a helyzet még nem ilyen egyszerű…

6. SOAP Header módosítása C#-ban attributumokkal:
Mivel ugye az authentikációhoz szükséges infó a SOAP messagek headerjében megy át (plain text-en a username és a password :) ), itt azért még kell egy kicsit trükköznünk. A SOAP message-nek a következőképpen kellene kinéznie:

<soap:envelope soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:header>
    <credentials>
      <userid>WebService_User</userid>
      <password>WebService_User</password>
    </credentials>
  </soap:header>
  <soap:body>
    <tns:getuserdetails xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xsd="http://www.w3.org/2001/XMLSchema"
                        soapenc="http://schemas.xmlsoap.org/soap/encoding/" tns="atlas">
      <string>userId</string>
    </tns:getuserdetails>
  </soap:body>
</soap:envelope>

Ehhez először is kell egy osztály, ami tartalmazza a userId-t és password-öt és majd bele lesz serializálva a Header-be. Ez az osztály valahogy így néz ki:


public class Credentials : SoapHeader {
  private string useridField;
  private string passwordField;

  public Credentials()  {  }

  public Credentials(string userid, string password) {
          this.useridField = userid;
          this.passwordField = password;
  }

  [System.Xml.Serialization.SoapElementAttribute(IsNullable = false)]
  public string userid {
          get {  return this.useridField; }
          set { this.useridField = value; }
   }

   [System.Xml.Serialization.SoapElementAttribute(IsNullable = false)]
   public string password  {
          get {  return this.passwordField; }
          set {  this.passwordField = value; }
   }
}

Ezt a Credential class-t példányosítva át kell adnunk a WS Client stub-unknak. A stub osztályban (nálam ez a Reference.cs-ben van) benne vannak a WS methodok, amiket meghívhatunk. Ahhoz, hogy a WS methodok hívásakor legenerálódó SOAP messagek tartalmazzák a Credentials header-t, az első sorban szereplő attributumot be kell szúrnunk a method definíció elé:


[System.Web.Services.Protocols.SoapHeader("Credentials",
                       Direction = SoapHeaderDirection.InOut)]
[System.Web.Services.Protocols.SoapRpcMethodAttribute("",
                       RequestNamespace="atlas", ResponseNamespace="atlas")]
[return: System.Xml.Serialization.SoapElementAttribute("result")]
public bool createProduct(AWSProduct aWSProduct) {
    object[] results = this.Invoke("createProduct", new object[] {aWSProduct});
    return ((bool)(results[0]));
}
7. Kliens példányosítása és futtatása:
Ezek után már csak annyi a feladat, hogy példányosítsuk a WS stub-unkat (persze át kell adni neki a példányosított Credentials osztályt), és meghívjuk a kiválasztott WS method-okat a megfelelő paraméterekkel.

Disclaimer: Nem vagyok C# developer. Meg kellett oldanom egy feladatot. Leírtam, hogy ne felejtsem el. Talán más is okul belőle :) Kommenteket szívesen fogadok…

One Response to “C# WS Client generálása (Web Reference Solution)”


  1. [...] WS Client készítésére C#-ban. A régi “Web Reference” megoldás megtalálható itt. A .NET 3.0-ás verziójában már Service Reference-eket tudunk hozzáadni a project-hez. A [...]


MINDEN VÉLEMÉNY SZÁMÍT!

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Módosítás )

Twitter kép

You are commenting using your Twitter account. Log Out / Módosítás )

Facebook kép

You are commenting using your Facebook account. Log Out / Módosítás )

Kapcsolódás: %s

Follow

Get every new post delivered to your Inbox.