Jason's Infrequent Ramblings

work,play,programming.

.Net : Reusing Types Across Multiple WebServices (using svcutil.exe)

For a long time I had an issue. I had a server .net project that had
multiple .asmx web services in it. In the server project, these
different services shared and returned various types: for example
Product. Just say we have Service1.asmx and Service2.asmx

When consuming these in another solution by adding a service reference
in VS2008, The problem was that Visual Studio was creating a name
space and types for each service, and not reusing them, so you'd end
up with the classes

MyNamespace.Service1.Product
MyNamespace.Service2.Product

and Soap clients like

MyNamespace.Service1.Service1SoapClient
MyNamespace.Service2.Service2SoapClient


Which was annoying, as you would have to be sure to create the correct
type of product object depending on what service you were about to
use. What I wanted was

SomeNamespace.API.Product
SomeNamespace.API.Service1SoapClient
SomeNamespace.API.Service2SoapClient


Turning to google, I found many suggestions to add a dll with the
orginal type to the project, and that the services would reuse this
type. They didn't. I found tip after tip referring to WCF, or
DataContact and various attributes, but that didn't work either.

I fould suggestions to use commands like :

svcutil /r:servertypes.dll /out:Service1.cs http://localhost/Service1.asmx
svcutil /r:servertypes.dll /out:Service2.cs http://localhost/Service2.asmx

which would reuse types. It didn't. I'm putting it down to not using
WCF on the server, but that's out of my hands.

But I figured it out. And the answer is fairly simple.

svcutil http://localhost/Service1.asmx http://localhost/Service2.asmx
/out:api.cs /namespace:*,SomeNamespace.API

Now, when the code is generated, you'll get a error that Product is
already defined, but it's more of a warning. But because the output is
combined, it works! Unlike calling it once for each service. Perhaps
I'll look at newer solutions for newer projects, but thankfully, the
annoyance is less for now.

Filed under  //   .net   c#   csharp   programming   svcutil   web services