Web Service Error – Permission issue
2009. December 19.
Tanulság: Ha linuxon fut az appserver/webserver akkor a bug keresése közben sose felejtsük ki a jogosultságokból adódó problémákat.
A sztori:
Résztvevők: Ubuntu Linux, Weblogic AppServer, Apache Weblogic plugin, és a csodálatos alkalmazásunk egy generált Web Service interface-szel.
A Probléma: Application maintanance és partial upgrade után az ügyfél Web Service Kliense a createProduct(Product product) WS methoddal nem működött. A findAllProduct() -tal viszont igen. A hibaüzenet a következő volt:
The remote server returned an unexpected response:
(400) Bad Request. ---> System.Net.WebException:
The remote server returned an error: (400) Bad Request..
1. Tesztelés saját klienssel: Kipróbáltam saját C# WS klienssel, és minden WS method tökéletesen működött. A saját és a kliens environmentjén egyaránt. Megírtam nekik, hogy frissítsék a WSDL file-t, generálják újra a WS Kliens Stub-ot, és próbálják újra.
2. Újrapróbálták. Nem ment.
3. Csináltam nekik példaprojectet. Ők visszaküldték az ő példájukat, ami tényleg nem működött. De csak a kliens environmentjén nem működött.
Az én C# kliensem a régi módszerrel Web Referenciaként importálta a WSDL file-t, míg az övéké Service Reference-ként. Egy ideig azt hittem, hogy a Service reference megvalósítás a hibás. De a mi env-ünkön ment…
4. Hozzáfogtam összehasonlítani a mi rendszerünket az ügyfélével. Minden tökéletesnek tűnt. A generált WSDL file megegyezett. A domain logig nem jutott el a kérés… Közben kiderült, hogy csak a paraméteres függvényhívások buknak el. Az Apache access logjában a következőt találtam:
Invalid URI in request (- SOAP message -)
GET /bridge_error.html HTTP/1.1
Ez még ok, mert nincs bridge_error.html bekonfigurálva. De mitől jön bridge error?
5. Az Apache Weblogic pluginon bekonfigoltuk a logozást. Ebből az derült ki, hogy “/tmp/_wl_proxy/”-ban lévő temp file-t nem tudja írni az apache mert nincs hozzá jogosultsága, ezért bukik el a request.
- Going to get the post data of size=2419 clength=0
- getWLFilePath: Complete File name =
[/tmp/_wl_proxy/_post_9929_0]
- Cannot open TEMP post file '/tmp/_wl_proxy/_post_9929_0'
for POST of 2419 bytes
- Redirecting the error response to the errorPage =
[/bridge_error.html]
- IO error reading client POST data; sys err#:
[13] sys err msg [Permission denied]
Az ok: Amikor az ügyfél rendszergazdája karbantarotta a servert, létrehozott egy új usert/groupot az Apache server futtatásához. Mivel az Apache ezzel az új userrel futott, az előzőleg létrehozott “_wl_proxy” könyvtárhoz nem volt hozzáférése. A POST HTTP requestek esetén az Apache proxy temp fileba menti a paramétereket, amiket jelen esetben nem tudott lementeni.
- Az ügyfél C# kliensével (Service Reference based) a paraméter nélküli függvényhívások azért működtek, mert nem kellett az Apache-nak semmit lementenie.
- Az én C# kliensemmel (Web Reference based) azért működött, mert az GET HTTP requesteket használt…
Megoldás: Rendszergazdaként töröltük a “_wl_proxy” mappát. A következő paraméteres HTTP POST requestnél az Apache újrakreálta ezt a mappát, és ezek után minden tökéletesen működött.
