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.

ColdFusion 9 issues with SBS Sharepoint and other sites.

I had helped someone install CF9 on their web server and we choose all sites when asked what IIS sites to connect it to. They had several IIS sites for their MS Small Business Server and one CF site. The CF site worked and we called it a day. A few days later they contacted me saying the SBS Sharepoint and other sites where breaking and the MS tech support thought it was ColdFusion. Well I had not heard of this before but went out to help. It seems that the CF 9 install adds a wild card IIS handler mapping for "*" so all requests go through CF. When they turned of the CF application service images were broken until they removed the wild card mapping. Why CF 9 needs a wildcard mapping I do not know.

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.

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.

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.