WCF Essentials—Generating the Proxy
| Visual C# Tutorials |
| .NET Framework Tutorials |
| © 2007 O'Reilly Media |
Generating the Proxy
You can use Visual Studio 2005 to import the service metadata and generate a proxy. If the service is self-hosted, first launch the service and then select Add Service Reference… from the client project’s context menu. If the service is hosted in IIS or the WAS, there is no need to pre-launch the service. Interestingly enough, if the service is self-hosted in another project in the same solution as the client project, you can launch the host in Visual Studio 2005 and still add the reference, because unlike most project settings, this option is not disabled during a debug session (see Figure 1-9).
![]()
Figure 1-9. Generate a proxy using Visual Studio 2005
This brings up the Add Service Reference dialog box, where you need to supply the
base address of the service (or a base address and a MEX URI) and the namespace to
contain the proxy.
Instead of Visual Studio 2005, you can use the SvcUtil.exe command-line utility. You
need to provide SvcUtil with the HTTP-GET address or the metadata exchange endpoint
address and, optionally, with a proxy filename. The default proxy filename is
output.cs but you can also use the /out switch to indicate a different name.
For example, if you’re hosting the service MyService in IIS or the WAS, and have
enabled metadata public sharing over HTTP-GET, simply run this command line:
SvcUtil http://localhost/MyService/MyService.svc /out:Proxy.cs
When you are hosting in IIS and selecting a port other than port 80 (such as port 81), you must provide that port number as part of the base address:
SvcUtil http://localhost:81/MyService/MyService.svc /out:Proxy.cs
With self-hosting, assuming the self-hosted service enabled metadata publishing over HTTP-GET, registers these base addresses and exposes the matching metadata exchange endpoints with a relative address of MEX:
http://localhost:8002/ net.tcp://localhost:8003 net.pipe://localhost/MyPipe
After launching the host, you can use the following commands to generate the proxy:
SvcUtil http://localhost:8002/MEX /out:Proxy.cs SvcUtil http://localhost:8002/ /out:Proxy.cs SvcUtil net.tcp://localhost:8003/MEX /out:Proxy.cs SvcUtil net.pipe://localhost/MyPipe/MEX /out:Proxy.cs
The main advantage of using SvcUtilover Visual Studio 2005 is the numerous options it offers through switches for controlling the generated proxies, as you will see later in this book.
For this service definition:
[ServiceContract(Namespace = "MyNamespace")] interface IMyContract { [OperationContract] void MyMethod( ); } class MyService : IMyContract { public void MyMethod( ) {...} }
SvcUtil generates the proxy shown in Example 1-15. You can safely remove the settings
of Action and ReplyAction in most cases, since the default of using the method
name is good enough.
Example 1-15. Client proxy file
[ServiceContract(Namespace = "MyNamespace")] public interface IMyContract { [OperationContract(Action = "MyNamespace/IMyContract/MyMethod", ReplyAction = "MyNamespace/IMyContract/MyMethodResponse")] void MyMethod( ); } public partial class MyContractClient : ClientBase<IMyContract>,IMyContract { public MyContractClient( ) {} public MyContractClient(string endpointName) : base(endpointName) {} public MyContractClient(Binding binding,EndpointAddress remoteAddress) : base(binding,remoteAddress) {} /* Additional constructors */ public void MyMethod( ) { Channel.MyMethod( ); } }
The most glaring aspect of the proxy class is that it has no reference to the serviceimplementing
class, only to the contract exposed by the service. You can use the
proxy in conjunction with a client-side config file that provides the address and the
binding, or you can use it without a config file. Note that each proxy instance points
at exactly one endpoint. The endpoint to interact with is provided to the proxy at
construction time. As I mentioned previously, if the service-side contract does not
provide a namespace, it will implicitly use the http://tempuri.org namespace.
|

