Adventure: Your CF and DotNet code are working great and talking on your dev server and integration server but not on test or production? Error says "Class xxx not found in the specified assembly list". Even though you can call built in dotnet methods, so the CF .Net integration service is working, you can't call any of your assemblies.
After comparing, trying and reading many, many, many things. The final solution was to uninstall and re-install the CF 8 .Net integration service. There is an install on the Adobe ColdFusion product downloads page. I found the solution on this forum post.
Showing posts with label side agent. Show all posts
Showing posts with label side agent. Show all posts
Thursday, August 4, 2011
Friday, July 22, 2011
Not another adventure using DotNet with ColdFusion via the side agent
Adventure: SVN fails to update the code when deploying to a server
Remember to stop the ColdFusion .Net service when doing an svn update. It hangs onto the DLL like candy in a 3 year old's hand. Stop the service, svn update, start the service. You should build this into your deployment process if you are able, ANT, powershell or batch files work well. Or you could use those nice MS deployment tools. We'll get there but we're still converting.
Remember to stop the ColdFusion .Net service when doing an svn update. It hangs onto the DLL like candy in a 3 year old's hand. Stop the service, svn update, start the service. You should build this into your deployment process if you are able, ANT, powershell or batch files work well. Or you could use those nice MS deployment tools. We'll get there but we're still converting.
Friday, July 8, 2011
Yes, more adventures using DotNet with ColdFusion
Adventure: Method not found!
When you get the error "method was not found", pause and take off your CF typeless hat and put on the hard typed language hat. The one with the big HTL on it. Even though in CF a number might be a string, the java proxy will convert it to a number. I was trying to set a CF variable holding a number into a dotnet property of type string and kept getting the "method not found". After a javacast to string it worked. The java proxy must have hard typed it to a numeric.
When you get the error "method was not found", pause and take off your CF typeless hat and put on the hard typed language hat. The one with the big HTL on it. Even though in CF a number might be a string, the java proxy will convert it to a number. I was trying to set a CF variable holding a number into a dotnet property of type string and kept getting the "method not found". After a javacast to string it worked. The java proxy must have hard typed it to a numeric.
Wednesday, June 29, 2011
Yes even more adventures with DotNet and ColdFusion
Adventure: pre-build and post-build events in Visual Studio
This adventure is more of a work flow improvement. Now I had been pointing my CF code at the Visual studio project's bin folder for the assembly. I do this using ColdSpring and a config object that has blocks of settings per environment. So on local dev I point at the project but on integration, test and prod I point at an assembly (dll) that is with my CF package folder structure. So on my laptop it uses the dll in the project so every time I build (restart the ColdFusion .Net service first) I get the new code. However I am not testing the deployed assembly in the CF package and I had to copy it from my VS project when I wanted to release that version.
I used a post build event in VS to copy the dll from my project to the CF package with something like this.
copy /y "$(TargetPath)" "C:\YourWebSiteDir\notWebRoot\dotnet"
Next I said why am I restarting the ColdFusion .Net service by hand.
Pre-build event:
Net stop "ColdFusion 8 .Net Service"
Post-build event (after the copy event):
Net start "ColdFusion 8 .Net Service"
So now I just build in VS and services are restarted and the dll updated in my CF source code.
This adventure is more of a work flow improvement. Now I had been pointing my CF code at the Visual studio project's bin folder for the assembly. I do this using ColdSpring and a config object that has blocks of settings per environment. So on local dev I point at the project but on integration, test and prod I point at an assembly (dll) that is with my CF package folder structure. So on my laptop it uses the dll in the project so every time I build (restart the ColdFusion .Net service first) I get the new code. However I am not testing the deployed assembly in the CF package and I had to copy it from my VS project when I wanted to release that version.
I used a post build event in VS to copy the dll from my project to the CF package with something like this.
copy /y "$(TargetPath)" "C:\YourWebSiteDir\notWebRoot\dotnet"
Next I said why am I restarting the ColdFusion .Net service by hand.
Pre-build event:
Net stop "ColdFusion 8 .Net Service"
Post-build event (after the copy event):
Net start "ColdFusion 8 .Net Service"
So now I just build in VS and services are restarted and the dll updated in my CF source code.
Wednesday, June 8, 2011
Even more adventures with DotNet and ColdFusion
Adventure 6: no automatic ToString() on DotNet string properties
I have some string properties in my dotnet poco (or transfer object) and I map them to my CF business object. But if the dotnet property is null the set fails in CF saying the parameter to the CF versions set method was not passed. So wrapping the get on the dotnet poco with the CF function ToString() solves this. Its as if CF can't convert the dotnet null to an empty string with out some help. No biggy, just interesting.
I have some string properties in my dotnet poco (or transfer object) and I map them to my CF business object. But if the dotnet property is null the set fails in CF saying the parameter to the CF versions set method was not passed. So wrapping the get on the dotnet poco with the CF function ToString() solves this. Its as if CF can't convert the dotnet null to an empty string with out some help. No biggy, just interesting.
Tuesday, June 7, 2011
More adventures using DotNet with ColdFusion
Adventure 4: What to send across the boundary.
When you instantiate a DotNet object in CF its always a good idea to dump it to see how the proxy changed any method names. Well the vendors wsdl I am working with has about 60 classes, enums and interfaces. Not very abstracted. In several cases a property would be one of two different depending on the results of the web service call. And they did not inherit any base class. I had to inspect the type and then cast the property to use it. Ouch. So instead of passing back nested business objects, enums and other dotnet fun stuff I decided to make a poco with all the information I needed. Boiling down about 7 to 10 objects and enums into one object with about 25 properties including some for exception messages.
Adventure 5: Who is the web.config for? Not ColdFusion.
In Visual Studio I had setup Fiddler as a proxy with https termination so I can see my soap call that are SSL. I had done this in the web.config. Well once I started calling the assembly (dll) from CF Fiddler stopped seeing the calls. Hmm. Come to find out the web.config is for IIS. Solution: the web service objects expose a proxy property you can set at run time by creating a WebProxy object. Warning: if the proxy is not available, fiddler running, it will not work. So this is just for debug.
When you instantiate a DotNet object in CF its always a good idea to dump it to see how the proxy changed any method names. Well the vendors wsdl I am working with has about 60 classes, enums and interfaces. Not very abstracted. In several cases a property would be one of two different depending on the results of the web service call. And they did not inherit any base class. I had to inspect the type and then cast the property to use it. Ouch. So instead of passing back nested business objects, enums and other dotnet fun stuff I decided to make a poco with all the information I needed. Boiling down about 7 to 10 objects and enums into one object with about 25 properties including some for exception messages.
Adventure 5: Who is the web.config for? Not ColdFusion.
In Visual Studio I had setup Fiddler as a proxy with https termination so I can see my soap call that are SSL. I had done this in the web.config. Well once I started calling the assembly (dll) from CF Fiddler stopped seeing the calls. Hmm. Come to find out the web.config is for IIS. Solution: the web service objects expose a proxy property you can set at run time by creating a WebProxy object. Warning: if the proxy is not available, fiddler running, it will not work. So this is just for debug.
Friday, June 3, 2011
Adventures using DotNet with ColdFusion via the side agent
I have a project were the web service of a vendor would not work with the Apache Axis 1.2.1 that CF uses.
However I was able to call it via dotnet. So I decided to use the CF to .Net integration. I'd used it before but rebuild my dev machine since and forgot some of the glitches.
This is all for ColdFusion 8.01 and .Net 3.5 framework. CF 8 does not work with .Net 4 and we are not on CF 9 yet.
Adventure 1: the java.lang.ClassNotFoundException error.
For starters if you are running the multi-server install the process that creates new server instances has a huge fault. It does not copy the dotnet proxy config to the created CF server instances. Find in the master cfusion instance this file, dotnet_coreproxy.config, and copy it to the same location in your server instance.
Adventure 2: unable to copy file [your assembly dll] another process is using it.
For development in CF I pointed at the dll in my projects bin directory. However once you invoke it from CF the CF .net side agent service locks this so when you recompile in Visual Studio it will error. Restarting the .net side agent service temporarily breaks the link.
Adventure 3: .net exception passed to CF = java.lang.ClassNotFoundException
Passing some exceptions back work just fine but if the exception has nested objects that CF does not know how to find to proxy it will error. Even if they are in my assembly. They must not be in base .net library that CF is using. I have not found a good solution other than creating my own object to pass back to CF.
Update: I implemented an exception processing function that catches several types of exceptions like SoapHeaderException and pulls the information out and adds it to a poco I created to simplify what CF has to deal with.
However I was able to call it via dotnet. So I decided to use the CF to .Net integration. I'd used it before but rebuild my dev machine since and forgot some of the glitches.
This is all for ColdFusion 8.01 and .Net 3.5 framework. CF 8 does not work with .Net 4 and we are not on CF 9 yet.
Adventure 1: the java.lang.ClassNotFoundException error.
For starters if you are running the multi-server install the process that creates new server instances has a huge fault. It does not copy the dotnet proxy config to the created CF server instances. Find in the master cfusion instance this file, dotnet_coreproxy.config, and copy it to the same location in your server instance.
Adventure 2: unable to copy file [your assembly dll] another process is using it.
For development in CF I pointed at the dll in my projects bin directory. However once you invoke it from CF the CF .net side agent service locks this so when you recompile in Visual Studio it will error. Restarting the .net side agent service temporarily breaks the link.
Adventure 3: .net exception passed to CF = java.lang.ClassNotFoundException
Passing some exceptions back work just fine but if the exception has nested objects that CF does not know how to find to proxy it will error. Even if they are in my assembly. They must not be in base .net library that CF is using. I have not found a good solution other than creating my own object to pass back to CF.
Update: I implemented an exception processing function that catches several types of exceptions like SoapHeaderException and pulls the information out and adds it to a poco I created to simplify what CF has to deal with.
Subscribe to:
Posts (Atom)