Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Force .NET webservice to use local object class, not proxy class

Tags:

I have a webservice that I'm calling from a windows forms application (both .NET, both in the same solution), and I'd like my webservice to return a custom object from elsewhere in the project - it's a common object that they both share a reference to, as it's in the third project in my solution. When I call the webservice, it returns a "Person" object, but it's in the namespace of the webservice, and it's created from a proxy class that the webservice itself generated. As such, I can't manipulate it and return it to my program, which is expecting a "Person" object based on the shared copy of the class, not a proxy copy from the webservice namespace, and I get an error when I try to CType it to the correct class type.

How do I force the webservice to use a local copy of the class, not a proxy copy? Does my question make any sense in this context? If not, I'll clarify it.

Of note - I've resorted to passing all of the parameters ByRef, and using those returned values to populate a copy of the object I create upon return. That can't be the best way to do this!

like image 830
SqlRyan Avatar asked Oct 19 '08 19:10

SqlRyan


2 Answers

If you are using svcutil.exe to generate a WCF client proxy, you can use /reference on the command-line to specify the assembly containing the common class. Svcutil should reuse that class definition instead of generating new one in the service proxy namespace.

Also, this will work only if your common class is serializable and passed by value (i.e. it's exposed as a data contract, not as a service contract).

like image 71
Franci Penov Avatar answered Oct 02 '22 13:10

Franci Penov


If you are using WCF is it fairly easy to use the same data contracts and service interface between the client and the consumer. You can either compile in the generated proxy class and modify it to use the correct namespaces or use the ChannelFactory class to create a dynamic proxy for you.

The first solution is very brittle and will cause you to modify the proxy class every time the service interface changes. The second technique works fairly well and we used in during a previous project I worked on. With either of these methods you need to make sure all your callers continue are up to date with the latest version of the interface.

From the way you are describing the problem it sounds like you want the service and the client to share the same instance. Since WCF serializes and deserializes your types as you send them to and from the service you would have to do something a bit more clever. Is this what you meant?

like image 45
smaclell Avatar answered Oct 02 '22 12:10

smaclell