Webszolgáltatás hívás kimenő IP címének beállítása

Ma egy olyan webszolgáltatást kellett meghívnom, ami előtt egy tűzfal csak bizonyos IP című kliensekről engedélyezi a hozzáférést. Ez normális esetben nem is szokott gondot okozni, most is megbeszéltem az ottani rendszergazdákkal, hogy milyen IP címről akarom küldeni a kérést, és ők készségesen lyukat ütöttek a tűzfalba. A nehezítést az jelentette, hogy a hívó épp egy szerver, aminek több IP címe van, és persze alapból nem arról ment ki a kérés, ahonnan én akartam. A kérdés tehát, hogy hogyan lehet megadni egy webszolgáltatás hívásnál a hívó IP címét?

A dolog szerencsére megoldható, de nem olyan egyszerűen, mint szeretnénk. A Visual Studio varázslója olyan proxy osztályt generál, ami a SoapHttpClientProtocol ősosztályból származik, aminek persze egy fikarcnyi ide vágó property-je sincsen. Viszont a HTTP híváshoz ő belül a HttpWebRequest osztályt használja, amin szerencsére lehet ilyen jellegű fogódzót találni. Persze csak alapos kereséssel, ugyanis a tulajdonságot úgy hívják, hogy ServicePoint, aminek a BindIPEndPointDelegate tulajdonságát (!) kell beállítani egy delegate-re! Én bizony ezt biztosan nem így csináltam volna, de gondolom jó okuk volt rá, hogy így döntöttek.

Sajnos a belső WebRequest példány szintén nincs kivezetve a SOAP proxy osztályban, így nincs más lehetőségünk, mint a VS által generált proxy osztályból egy újabb osztályt származtatni, és ott felülírni azt a metódust, ami a WebRequest példány előállításáért felelős. Miután ezt így fejben levezette az ember, a kód már meglehetősen rövid:

class MyServiceWrapper : MyVSGeneratedServiceProxyClass
{
  public IPAddress SourceIPAddress { get; set; }

  protected override WebRequest GetWebRequest( Uri uri )
  {
    HttpWebRequest request = (HttpWebRequest) base.GetWebRequest( uri );
    request.ServicePoint.BindIPEndPointDelegate = new BindIPEndPoint(
      delegate( ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount )
      {
        return new IPEndPoint( this.SourceIPAddress, 0 );
      });
    return request;
  }
}

Persze akinek nem jön be ez a tömör névtelen metódusos megoldás, az írhat olvashatóbb kódot két metódusba:

protected override WebRequest GetWebRequest( Uri uri )
{
  HttpWebRequest request = (HttpWebRequest) base.GetWebRequest( uri );
  request.ServicePoint.BindIPEndPointDelegate = 
    new BindIPEndPoint( this.OnBindIPEndPoint );
  return request;
}


private IPEndPoint OnBindIPEndPoint( ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount )
{
  return new IPEndPoint( this.SourceIPAddress, 0 );
}

Végül már csak annyi dolgunk maradt, hogy a Studio által generált osztály helyett a sajátunkat példányosítjuk és beállítjuk a SourceIPAddress tulajdonságot a kívánt IP címre.

Technorati-címkék:


Balássy György (MS RD, ASP.NET MVP, MCTS)

Balássy György (MS RD, ASP.NET MVP, MCTS) Villamosmérnök, a BME Automatizálási és Alkalmazott Informatikai Tanszékén webportálok fejlesztését oktatja. 2000 óta foglalkozik a Microsoft .NET platformjával, melynek meghonosításában jelentős szerepet vállalt előadóként, konzulensként és A .NET Framework és programozása című könyv társszerzőjeként. Az MSDN Kompetencia Központon belül a Portál Technológiák Csoport vezetője, szakterülete web alapú rendszerek fejlesztése és üzemeltetése. 2004-ben Magyarországon elsőként kapta meg a Most Valuable Professional címet, majd 2005 óta a Microsoft magyarországi regionális igazgatója. Publikációi a Technet Magazinban, az MSDN Kompetencia Központ honlapján és szakmai blogjában olvashatóak.

2011.01.06. 20:49:58 | Permalink | Hozzászólások: 0 | Tárgyszavak: ,


  • Felhasználó utánzatok

    Balássy György (MS RD, ASP.NET MVP, MCTS) ASP.NET-es fejlesztés közben gyakran előfordul, hogy egy olyan funkciót kell megvalósítanunk, amely felhasználói fiókhoz vagy szerepkörhöz kötött, de még nincs kész a projektünkben a regisztráció vagy a bejelentkezés oldal.Ilyenkor az egyik lehetőség a felhasználói adatbázis gyors összekattintgatása, de ha ezt nem tehetjük meg, akkor nincs más megoldás, mint saját Memebership- és Role providerek készítése, amelyek ugyanúgy bejelentkeztetik a felhasználót, de nem igényelnek adatbázist. Ez egyszerűbb, mint azt első hallásra gondolnánk. Tovább »
  • Almás gomb Silverlightban

    Balássy György (MS RD, ASP.NET MVP, MCTS) Nagy fába vágtam a fejszém, amikor szerettem volna valami igazán szépet alkotni Silverlightban, ugyanis a dizájnhoz egyáltalán nem értek. Valahonnan viszont rémlett, hogy az Expression Design tud Photoshopból importálni és XAML-be exportálni, így letöltöttem egy pofás iPhone stílusú gombot a netről .psd formátumban és megpróbáltam .xaml-lé alakítani. Nem sikerült :( Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások