1. Alan Rice
  2. PowerBuilder
  3. Monday, 21 May 2018 15:19 PM UTC

PB Classic > .NET Webservice calling external SOAP webservice using WS Proxy. Object reference not set to an instance of an object

Hi,

I hope someone can help with this one.

This problem only happens on a production server not on my development machine. The production has a C:\ but uses another drive for websites, may need other permissions set if PB is looking for access to a folder I don't know about.

 

I have a Powerbuilder 12.1 project which deploys a .NET Webservice. 
This application connects to completely separate SOAP webservice. 
On the production server I get the following error :

System.Web.Services.Protocols.SoapException: Object reference not set to an instance of an object. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at c__storageservices.getsharedaccesssignatureurl(PBString accesstoken, PBString containername, PBString filename) in c:\Development\xxxxxxxxxxxxxxxxxxxx\pb2cstempout\xxxxxxxxxxxxxxxxxxxx\storageservices.cs:line 0
   at c__n_mares.alantest() in c:\Development\xxxxxxxxxxxxxxxxxxxx\pb2cstempout\xxxxxxxxxxxxxxxxxxxx\n_mares.alantest(S):line 14
   at cns_xxxxxxxxxxxxxxxxxxxx.PBWS__n_mares.alantest() in c:\Development\xxxxxxxxxxxxxxxxxxxx\pb2cstempout\xxxxxxxxxxxxxxxxxxxx\xxxxxxxxxxxxxxxxxxxx.asmx.cs:line 3954
   --- End of inner exception stack trace ---
   at Sybase.PowerBuilder.Web.WebServices.PBWebService.HandleException(Exception ex)
   at cns_xxxxxxxxxxxxxxxxxxxx.PBWS__n_mares.alantest() in c:\Development\xxxxxxxxxxxxxxxxxxxx\pb2cstempout\xxxxxxxxxxxxxxxxxxxx\xxxxxxxxxxxxxxxxxxxx.asmx.cs:line 3964

xxxxxxxxxxxxxxxxxxxx = project name folder

c:\Development\xxxxxxxxxxxxxxxxxxxx\pb2cstempout is a folder present on my machine but does not exist on the production server.
In fact the access to C: would be limited on production with everything running from another drive.

Could there be a permissions issue that I can update?

 

Call to Webservice

Long        ll_conn_result, ll_log
String ls_access_token, ls_filename, ls_url
storageservices l_storageservices                                  // Declare proxy
SoapConnection  conn                                               // Define SoapConnection - if it gives out that soapconnection is an invalid type something went wrong with the pbx import
 
conn    =   create SoapConnection                          // Instantiated connection
ll_log  =   conn.SetSoapLogFile ("C:\mySoapLog.log")       // Set trace file to record soap interchange data,
                                                                     // if string is "", disables the feature  
 
ls_access_token = 'test123'
ls_filename = 'test.pdf'
ll_conn_result = Conn.CreateInstance(l_storageservices,"storageservices")
 
ls_url = l_storageservices.getsharedaccesssignatureurl(ls_access_token, 'mareforms', ls_filename)
 
// Destroy Conn
destroy conn
 
return ls_url
 

 

Any help would be appreciated, even if its a suggestion of where I can find a better error or steps to get to the bottom of it as I am at a loss.

 

Thanks,
Alan

 

 

Kevin Ridley Accepted Answer Pending Moderation
  1. Monday, 21 May 2018 17:51 PM UTC
  2. PowerBuilder
  3. # 1

My first guess would be that the CreateInstance is failing and you are not checking the return code, so you just go right into the method call.  I would do the following:

1)I ALWAYS use try/catch for web service calls - you may catch the same error, but it's good practice anyway, and then you can handle the exception.

   try

      conn = create soapconnection

      ...

catch(soapexception se)

   //log the error or maybe msg box

finally

   If IsValid(anything-you-crearted) then destroy anything-you-created

end try

 

2) Check the return code from the conn.CreateInstance method.  If it's not 0, your following method call is going to fail - so don't make the call

   * this is probably where it is failing.  Be sure your DLL (that is created when you run the project to create the ws objects) is deployed properly to the correct folder on the server and be sure the server can access the URL for the web service

 

3) In this case it probably won't help because you don't seem to be even making the call, but download Fiddler and monitor the web traffic from that machine, you may see something in the request or response.  Again, I don't think it's ever reaching the actual web service, so in this case it probably won't help.  But it's a great tool for use with web services.

 

HTH,

Kevin

Comment
  1. Alan Rice
  2. Tuesday, 22 May 2018 15:06 PM UTC
Hi Kevin,



The ll_conn_result returns 0. I did a test build which I ran on the production server (I added a note to my sample script above to show how its currently stepping through the function).



I can access the webservice WSDL using a browser and SOAPUI without issue.



I'm using the .net engine. In addition to the storageservices.dll there are also 2 other dlls as part of the project bin folder which are: named project.dll and project_ws.dll.

The dlls you mention are present in the GAC and sybase program files folder under dotnet and packagestoload folders. pbwsdl12 and pbwsdlclient12 are present in the shared folder. The permissions on this folder has permissions for the IIS user.



 

  1. Helpful
  1. Kevin Ridley
  2. Wednesday, 23 May 2018 14:18 PM UTC
What about the 4 DLLs I mentioned?  (Sybase.Powerbuilder.WebService.Runtime.dll, Sybase.PowerBuilder.WebService.RuntimeRemoteLoader.dll, Sybase.PowerBuilder.WebService.WSDL.dll, Sybase.PowerBuilder.WebService.WSDLRemoteLoader.dll)

  1. Helpful
  1. Alan Rice
  2. Friday, 25 May 2018 10:14 AM UTC
Hi Kevin,



As per my previous reply the dlls you mention (Sybase.Powerbuilder.WebService.Runtime.dll, Sybase.PowerBuilder.WebService.RuntimeRemoteLoader.dll, Sybase.PowerBuilder.WebService.WSDL.dll, Sybase.PowerBuilder.WebService.WSDLRemoteLoader.dll) are present in the GAC32 and sybase program files folder under dotnet and packagestoload folders. pbwsdl12 and pbwsdlclient12 are present in the shared folder. The permissions on this folder has permissions for the IIS user.



Thanks for your help.

  1. Helpful
There are no comments made yet.
Marco Meoni Accepted Answer Pending Moderation
  1. Tuesday, 22 May 2018 06:43 AM UTC
  2. PowerBuilder
  3. # 2

Hi Alan,

first of all, the fact that it does not happen on your DEV machine may indicate that there're missing dependencies on the PROD server.
The problem is exactly what reported by the error, you are trying to use a null object as if it was a properly referenced object.
Please check first if the null object is part of the PB ecosystem, i.e. you have both PB SOAP and PB .NET WS runtime installed on the PROD server (use PB package manager tool + install .NET pre-requirements from %PB%\DotNET\pbiu\BootStrapper\Packages\1-PBRuntime).
In the worst scenario, run the PB 12.1 setup on the server in order to get all proper runtime installed (no license needed, just install in evaluation mode).
Best,
Marco

Comment
  1. Alan Rice
  2. Tuesday, 22 May 2018 12:05 PM UTC
Hi Marco,



Thanks for the reply. Unfortunately these were installed on this machine previously, and it also has a copy of PB12.1 installed.



This is part of an existing webservice we've created with PB, but just first time using SOAP to connect to an external service.



I checked that the production machine can reach the third party service and WSDL just using a browser and no issue there. Also it appears that its failing after the SOAP connection is made (please see my other reply to Kevin).



Best Regards,

Alan Rice

Equisoft 

  1. Helpful
There are no comments made yet.
Chris Pollach @Appeon Accepted Answer Pending Moderation
  1. Tuesday, 22 May 2018 13:46 PM UTC
  2. PowerBuilder
  3. # 3

Hi Alan;

  Make sure that you have installed on the production machine ...

  • You have the same version of the .NET framework
  • Current version of the SDK for that O/S.
  • Application pool is the same configuration as in Dev.
  • You have installed the App into the same folder structure as DEV
  • Proper folder rights have been granted to your app

Regards .. .Chris

Comment
  1. Alan Rice
  2. Tuesday, 22 May 2018 14:47 PM UTC
Hi Chris,



Thanks for the reply.





.NET

Both machines have the exact same version which is 4.6.x (minor matches up too)

SDK for that O/S

What do you mean for this part. They are different O/S. Windows 7 vs 2012 R2

Which SDK?

App Pool

Everything looks the same here, its PBApp pool and using .Net 2.x

You have installed the App into the same folder structure as DEV

Can you explain more what you mean here. The web folder on the production server is under a different folder and drive than my dev machine.

Proper folder rights have been granted to your app

The main web folder has the correct permissions set, but should there be other folders that I need to setup permissions on.





Alan

  1. Helpful
  1. Chris Pollach @Appeon
  2. Tuesday, 22 May 2018 15:16 PM UTC
Hi Alan;



   Sounds like your set-u pretty good on the production server side then. Yes, the SDK matches your O/S and thus would be different. Otherwise, all the other pieces should be the same.



  The other important thing that I should have mentioned before is that the PB runtime& build should be exactly the same as well (including any EBF's).



Chris



 

  1. Helpful
There are no comments made yet.
  • Page :
  • 1


There are no replies made for this question yet.
However, you are not allowed to reply to this question.