Click here to Skip to main content
Email Password   helpLost your password?

Introduction

In the world of distributed application, many technologies has been introduced, implemented and used like DCOM, CORBA,…etc.

And after that, a new concept has been adapted,it was the web services. Web service is simple to develop and implement without paying attention to firewall issues and as a result, communication between systems has been simplified.

The problem while developing a web service is you need to host it inside a web server like IIS or Apache using http or wshttp protocols, and this is the only option you have.
WCF has solved this issue, by providing the possibility to host your service in a different application process using also various protocols.

In this article I’ll show how you can achieve this.

The sample code includes a simple WCF service, console windows host, windows service host, IIS6 host, II7 host and client console windows application built in VS 2008 Standard edition and .NET 3.0.

Background

As we know if you adopt web services architecture for your system, you need the flowing:
- create a service like a component library using [WebService] and [WebMethod] attributes
- host it inside a web server like IIS
- generate a proxy (interface or contract) from the WSDL
- distribute this proxy to clients application who needs to call and use this web service.

Multiple Host and Protocol Support with WCF

Microsoft has introduced the WCF concept in order to make distributed application development and deployment simple.

Hosting Environment Supported protocol
Windows console and form application HTTP,net.tcp,net.pipe,net.msmq
Windows service application (formerly known as NT services) HTTP,net.tcp,net.pipe,net.msmq
Web server IIS6 http, wshttp
Web server IIS7 - Windows Process Activation Service (WAS) HTTP,net.tcp,net.pipe,net.msmq

Architect_Article.PNG

Create a test service

Here I have created a very simple service called “FirstWcfService.Service” as in the following listing -1 :

FirstWcfService.PNG

// Listing -1 IService.cs file
using System;
using System.Runtime.Serialization;
using System.ServiceModel;
namespace FirstWcfService
{
    [ServiceContract]
    public interface IService
    {
   
        [OperationContract]
        string Hello(); 
    }
}
// Service.cs file
using System;
namespace FirstWcfService
{
    public class Service : IService
    {
        public string Hello()
        {
            return ("Hello WCF");
        }
    }
}

As we can see, this service contains only on operation contract (Hello), this operation will return simple string “Hello WCF”.


Hosting our service

As I have mentioned in the begging of my article, with the arrival of WCF, now we have multiple options to host this service.

In each hosting environment, we need to provide an endpoint for this service and also we need to reference it, in order the client application can reach this service.
What does that mean practically, it means we have to create a configuration file for our hosted service.

Option 1 – windows console host application

1 - I created here a classic console application (picture 1) and then I hosted my service as in the following listing – 2:

FirstWcfServiceHostConsoleApp.PNG

//Listing – 2 Program.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace FirstWcfServiceHostConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
          
using (ServiceHost host = new ServiceHost(typeof(FirstWcfService.Service)))
            {
                host.Open();
                Console.WriteLine("Press <Enter> to terminate the Host application.");
                Console.ReadLine();
            }
           
        }
    }
}

In order to host a WCF service inside a console application we need a minimum of work. Let us examine the code in the above listing:
This code ServiceHost host = new ServiceHost(typeof(FirstWcfService.Service)
creates an instane of our service.
This line host.Open() makes the service ready for access inside the hosting enviroemnt.

2- Secondly I have created a configuration file with a minimum configuration options as in the following listing - 3:

//Listing – 3 App.config
<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="FirstWcfService.Service" behaviorConfiguration="ServiceBehavior">
        <!-- Service Endpoints -->
        <endpoint address="FirstWcfService" binding="netTcpBinding" 
            contract="FirstWcfService.IService"/>
        <!-- This Endpoint is used for genertaing the proxy for the client -->
 <!-- To avoid disclosing metadata information, set the value below to false and
       remove the metadata endpoint above before deployment -->
        <endpoint address="mex" contract="IMetadataExchange" binding="mexTcpBinding" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:9100/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpGetEnabled="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Option 2 – windows service host application

1 - I created here a classic windows service application and then I hosted my service as in the following listing – 4:

FirstWcfServiceWindowsServiceHost.PNG

//Listing - 4, Program.cs
using System;
using System.ServiceProcess;
namespace Windows_Service
{
    static class Program
    {
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] { new WCFWindowsService() };
            ServiceBase.Run(ServicesToRun);
        }
    }
}
//Listing - 4, WCFWindowsService.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.ServiceProcess;
using System.ServiceModel;
namespace Windows_Service
{
    public partial class WCFWindowsService : ServiceBase
    {
       ServiceHost m_serviceHost;
        
protected override void OnStart(string[] args)
        {
            m_serviceHost = new ServiceHost(typeof(FirstWcfService.Service));
            m_serviceHost.Open();
        }
        
        protected override void OnStop()
        {
            if (m_serviceHost != null)
            {
                m_serviceHost.Close();
            }
            m_serviceHost = null;
        }
    }
}

In order to host a WCF service inside a windows service application, we need also a minimum of work by implementing the followings functions:
void OnStart(string[] args) and protected override void OnStop()
Let us examine the code in the above listing:
This code:
m_serviceHost = new ServiceHost(typeof(FirstWcfService.Service));
m_serviceHost.Open();
creates an instane of our service and then makes the service ready for access inside the hosting enviroment.

2 - To make this application working like a windows service, we should install it as in Listing – 5. This file is not related to WCF implementation, so I’m not going to explain what does this code does.

//Listing - 5, WCFWindowsServiceInstaller.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;
// To install or uninstall this Windows service via cmd:
//
//C:\Program Files\Microsoft Visual Studio 9.0\VC>installutil.exe /u  yourpath/WCFWindowsService.exe
//C:\Program Files\Microsoft Visual Studio 9.0\VC>installutil.exe     yourpath/WCFWindowsService.exe
namespace Windows_Service
{
    [RunInstaller(true)]
    public partial class WCFWindowsServiceInstaller : Installer
    {
        public WCFWindowsServiceInstaller()
        {
            InitializeComponent();
            ServiceProcessInstaller processInstaller = new ServiceProcessInstaller();
            ServiceInstaller serviceInstaller = new ServiceInstaller();
            processInstaller.Account = ServiceAccount.LocalSystem;
            serviceInstaller.DisplayName = "WCF_WindowsService";
            serviceInstaller.Description = "WCF_WindowsService.";
            serviceInstaller.ServiceName = "WCF_WindowsService";
            serviceInstaller.StartType = ServiceStartMode.Manual;
            Installers.Add(processInstaller);
            Installers.Add(serviceInstaller);
        }
    }
}

3 - I have created a configuration file with a minimum configuration options as in the following listing - 6:

 //Listing - 6, App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="FirstWcfService.Service" behaviorConfiguration="ServiceBehavior">
        <endpoint address="FirstWcfService" contract="FirstWcfService.IService"
             binding="netTcpBinding" />
        <!-- This Endpoint is used for genertaing the proxy for the client -->
        <endpoint address="mex" contract="IMetadataExchange" binding="mexTcpBinding" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:9000"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpGetEnabled="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Option 3 – IIS6 host application

1 - I created here a simple WCF Service web application and then I have referenced FirstWcfService in order to host it as in the following listing – 7:

FirstWcfIIS6Host.PNG

 //Listing - 7, file Service.svc
<%@ ServiceHost Language="C#" Debug="true" Service="FirstWcfService.Service"%>

As see can see her, when we host a WCF service inside IIS, we do not need to create a host service and open it as we have done in the console and service windows application hosting, because IIS is responsible for creating the service and make it listening to clients calls, all we need just the above code inside a .svc file.

2- I have created a configuration file with a minimum configuration options as in the following listing -8:

//Listing - 8, Web.config
<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="FirstWcfService.Service" behaviorConfiguration="ServiceBehavior">
        <!-- Service Endpoints -->
        <endpoint address="" binding="basicHttpBinding"
           contract="FirstWcfService.IService"/>
       <!-- This Endpoint is used for genertaing the proxy for the client --> 
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <!-- To avoid disclosing metadata information, set the value below to
              false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes,
              set the value below to true.  Set to false before deployment to avoid
              disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Option 4 – IIS7 (WAS) host application

1 - I created here a simple WCF Service web application using windows server 2008 (IIS7) and then I have referenced FirstWcfService in order to host it as in the following listing – 9:

FirstWcfIIS7Host.PNG

//Listing - 9 file Service.svc
<%@ ServiceHost Language="C#" Debug="true" Service="FirstWcfService.Service"%>

2- I have created a configuration file with a minimum configuration options as in the following listing -10:

//Listing - 10, Web.config
<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="FirstWcfService.Service" behaviorConfiguration="ServiceBehavior">
        <!-- Service Endpoints -->
        <endpoint address="" binding="netTcpBinding" contract="FirstWcfService.IService"
            bindingConfiguration="tcpbinding"/>
        <endpoint address="mextcp" binding="mexTcpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <!-- To avoid disclosing metadata information, set the value below to false
              and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes,
               set the value below to true.  Set to false before deployment to avoid
               disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <netTcpBinding>
        <binding name="tcpbinding">
          <!--<security mode="None"></security>-->
          <security mode="Transport">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
            <message clientCredentialType="Windows"/>
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

NOTE:As you can see here, I have done the same implementation as I did for option 3 while hosting my SCF service inside II6, the only difference is, I have configured my service to be callable using “net.Tcp” protocol inside IIS7 (WAS) instead of classic “basicHttp” protocol. I’m not going to explain the new architecture of IIS7, because this topic is out of scope in this article.

3- When you create a WCF service inside IIS7, by default this service has only http and wshttp enabled. I have configured my service to be callable using net.Tcp protocol as in the following steps:

A - in order to enable a new protocol like net.Tcp, we need to add it to our default web site tree via IIS Manager by clinking on “Edit Bindings”

IIS7Manager1.PNG

B - Add the new protocol with the desired port also, I added 9200

IIS7Manager3.PNG

IIS7Manager2.PNG


C – Always from IIS Manager, add the net.Tcp to your WCf service by clicking on advanced settings:

IIS7Manager4.PNG


D – write your desired protocol through Enabled protocols settings :

IIS7Manager5.PNG

Create the client application

I created a simple client console application in order to show you how we can call our WCF service using multiple hosting options.
My client application looks like this:

FirstWcfServiceClientConsoleApp.PNG

Let’s examine this application:
1 – We need co create a proxy, to create a proxy we have tow possibilities:
Either from Visual studio by adding a service reference as below :

ServiceRef.PNG

Or by using the SvcUtil.exe utility, as we have multiple hosting options, we can observe here that we need just to use one of the following created proxy :
• If you create the proxy from a service hosted inside a console application you make: SvcUtil.exe net.tcp://localhost:9100/mex /out:path\proxy.cs /n:*,localhost
• If you create the proxy from a service hosted inside a windows service application you make SvcUtil.exe net.tcp://localhost:9000/mex /out:path\proxy.cs /n:*,localhost
• If you create the proxy from a service hosted inside an IIS 6 you make SvcUtil.exe http://localhost/FirstWcfIISHost/Service.svc /out:path\proxy.cs /n:*,localhost
• If you create the proxy from a service hosted inside an IIS7 using tcp protocol you make SvcUtil.exe net.tcp://winserver2008:9200/FirstWcfHost/Service.svc/ out:path\proxy.cs /n:*,localhost

When you create your proxy for the first time, you can use the same proxy to call the same service inside different hosting environments.
Finally our proxy will be as the following listing – 11

// Listing - 11 proxy.cs file
namespace localhost
{
    
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="localhost.IService")]
    public interface IService
    {
        
        [System.ServiceModel.OperationContractAttribute(Action =
            "%22http://tempuri.org/IService/Hello%22">http://tempuri.org/IService/Hello",
            ReplyAction = "%22http://tempuri.org/IService/HelloResponse%22">http://tempuri.org/IService/HelloResponse")]
        string Hello();
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    public interface IServiceChannel : localhost.IService,
        System.ServiceModel.IClientChannel
    {
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    public partial class ServiceClient :
        System.ServiceModel.ClientBase<localhost.IService>, localhost.IService
    {
        
        public ServiceClient()
        {
        }
        
        public ServiceClient(string endpointConfigurationName) : 
                base(endpointConfigurationName)
        {
        }
        
        public ServiceClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }
        
        public ServiceClient(string endpointConfigurationName,
            System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }
        
        public ServiceClient(System.ServiceModel.Channels.Binding binding,
            System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress)
        {
        }
        
        public string Hello()
        {
            return base.Channel.Hello();
        }
    }
}

2- I have created a configuration file with a minimum configuration options as in the following listing -12:

//Listing - 12, App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <!-- calling the WCF service which is hosted inside windows console application -->
      <endpoint address="net.tcp://localhost:9100/FirstWcfService" binding="netTcpBinding"
          contract="localhost.IService" name="Windows_Console_Host_TcpBinding">
      </endpoint>
      <!-- calling the WCF service which is hosted inside IIS6 -->
      <endpoint address="%22http://localhost/FirstWcfIISHost/Service.svc%22">http://localhost/FirstWcfIISHost/Service.svc"
          binding="basicHttpBinding"
          contract="localhost.IService" name="IIS_Host_HttpBinding">
      </endpoint>
      <!-- calling the WCF service which is hosted inside windows service  -->
      <endpoint address="net.tcp://localhost:9000/FirstWcfService"
          binding="netTcpBinding"
          contract="localhost.IService" name="Windows_Services_Host_TcpBinding">
      </endpoint>
      <!-- calling the WCF service which is hosted inside IIS7 (WAS)  -->
      <endpoint address="net.tcp://winserver2008:9200/FirstWcfHost/Service.svc"
          binding="netTcpBinding"
          contract="localhost.IService" name="II7_WAS_Host_TcpBinding"
          bindingConfiguration="II7NetTcpBinding">
      </endpoint>
    </client>
    <bindings>
      <netTcpBinding>
        <binding name="II7NetTcpBinding">
          <!--<security mode="None"></security>-->
          <security mode="Transport">
                    <transport clientCredentialType="Windows"
                         protectionLevel="EncryptAndSign"/>
                    <message clientCredentialType="Windows"/>
                  </security>
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

In this file I have configured my client in order to show you how we can call the same WCF service hosted in different environments. In realty you do not need all these endpoints, you need only one of these endpoints for your client, so your “app.config” would be as in following listing - 13:

<?x ml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <!-- calling the WCF service which is hosted inside windows console application -->
      <endpoint address="net.tcp://localhost:9100/FirstWcfService" binding="netTcpBinding"
          contract="localhost.IService" name="Windows_Console_Host_TcpBinding">
      </endpoint>
    </client>
   </system.serviceModel>
</configuration>

3- I have implemented my client as in the following listing -14:

//Listing - 14, Program.cs
using System;
namespace FirstWcfServiceClientConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                #region Call the hosted service inside IIS6
                localhost.ServiceClient iis6proxy = new localhost.ServiceClient(
                    "IIS_Host_HttpBinding");
                Console.WriteLine("=====================");
                Console.WriteLine("Call the hosted service inside IIS6");
                Console.WriteLine(iis6proxy.Hello());
                Console.WriteLine("=====================");
                Console.WriteLine();
                #endregion
                #region Call the hosted service inside IIS7 (WAS)
                localhost.ServiceClient iis7proxy = new localhost.ServiceClient(
                    "II7_WAS_Host_TcpBinding");
                Console.WriteLine("=====================");
                Console.WriteLine("Call the hosted service inside IIS7 (WAS)");
                Console.WriteLine(iis7proxy.Hello());
                Console.WriteLine("=====================");
                Console.WriteLine();
                #endregion
                #region Call the hosted service inside Windows service application
                localhost.ServiceClient tcpWindowsSrviceproxy =
                    new localhost.ServiceClient("Windows_Services_Host_TcpBinding");
                Console.WriteLine("=====================");
                Console.WriteLine(
                    "Call the hosted service inside Windows service application");
                Console.WriteLine(tcpWindowsSrviceproxy.Hello());
                Console.WriteLine("=====================");
                Console.WriteLine();
                #endregion
                #region Call the hosted service inside Windows Console application
                localhost.ServiceClient tcpproxy = new localhost.ServiceClient(
                     "Windows_Console_Host_TcpBinding");
                Console.WriteLine("=====================");
                Console.WriteLine(
                    "Call the hosted service inside Windows Console application");
                Console.WriteLine(tcpproxy.Hello());
                Console.WriteLine("=====================");
                Console.WriteLine();
                Console.WriteLine("Press <Enter> to terminate the client application.");
                Console.ReadLine();
                #endregion
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.ReadLine();
            }
        }
    }
}

In the above code, we notice that in order to call a WCF service, we need to instantiate the proxy class like this :

localhost.ServiceClient iis6proxy = new localhost.ServiceClient("IIS_Host_HttpBinding");

and then we can call a function or method we are interested like this:

iis6proxy.Hello());

Putting all together and get the result

My final solution will be something like that:

FirstWcfServiceSolution.PNG

Finally when we run the client application (FirstWcfServiceClientConsoleApp.exe) after verifying that all four hosting environments (IIS6, IIS7, windows service, windows console application) are running and listening, we get the following wonderful result:

ClientResult.PNG

As you can notice here, we have created a WCF service, hosted it in four different environments as below using different protocols :

- Windows a console application using tcp protocol
- Windows service process using tcp protocol
- IIS6 using http protocol
- IIS7 using tcp protocol

By changing only the endpoint on the client we have been able to access our WCF service and calling functions.
What I do like to precise here, different client applications (Windows, Intranet, Internet, Extranet, ..etc) can call the service in different hosting environments.

Conclusion

We can conclude that WCF provides us a very simple development and deployment framework, but very powerful way of establishing communication between diverse systems using SOA (Service Oriented Architecture) designs and approaches.

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
Generalhost a service inside IIS
makis_g3
2:45 6 Jul '09  
I have question on how to host a service inside IIS,and call from mobile device.
http://social.microsoft.com/Forums/en-US/uklaunch2007ado.net/thread/9bf0b2ce-7dba-46ab-bf31-b383caf4a7dc
Any guidness will be helpfull.
Thanks in advance.
GeneralIdentifying the endpoint
Gilad Kapelushnik
6:15 3 Jun '09  
Hi,

Nice article.

I was wondering if you happen to know a way to identify the called endpoint from within the executed webmethod.

Thank you for your help.
GeneralRe: Identifying the endpoint
Faris Y. Elias SHOMOU
11:07 4 Jun '09  
Hi, you can try this :

InstanceContext ic = OperationContext.Current.InstanceContext;
Uri uri = OperationContext.Current.IncomingMessageHeaders.To;
ServiceEndpoint sep = ic.Host.Description.Endpoints.Find(uri);
string calledEndpoint = sep.Name;


Regards,

Faris
QuestionHow about over HTTPS?
JeffOstrosser
8:39 2 Jun '09  
How can we configure a self hosted WCF service to respond only to HTTPS requests?
AnswerRe: How about over HTTPS?
Faris Y. Elias SHOMOU
11:25 2 Jun '09  
Read this link:

SSL with Self-hosted WCF Service Using of self-hosted service with SSL

GeneralMultiple http bindings don't work
kwilder
7:52 18 May '09  
What about the case of a production web server with multiple http bindings, such as www.mydomain.com, domain.com?

An error is thrown complaining about the multiple http bindings. How do you get around this?

Thanks.
GeneralRe: Multiple http bindings don't work
Faris Y. Elias SHOMOU
22:44 18 May '09  
Hi,

Are you using IIS6,if yes you need IIS7.

Regards,
GeneralRe: Multiple http bindings don't work
kwilder
7:23 19 May '09  
Yes, it's IIS 6.0. Are you saying there's no way to do it on IIS 6.0?
GeneralRe: Multiple http bindings don't work
Faris Y. Elias SHOMOU
23:11 24 May '09  
Yes, there is no way in IIS 6.0
GeneralThanks!
Chendl
3:47 26 Feb '09  
Help me a lot! Thanks!
GeneralRe: Thanks!
Faris Y. Elias SHOMOU
5:35 27 Feb '09  
You are welcome.
Generalunable to generate proxy object
ba0021
0:45 11 Dec '08  
dear Faris,

when i debugged your application for host and client it works fine but when i tried to creat fresh proxy.cs file by the command you have given for console application it gives me following error could you please help me out on this


Error: Cannot obtain Metadata from net.tcp://localhost:9100/mex

If this is a Windows (R) Communication Foundation service to which you have acce
ss, please check that you have enabled metadata publishing at the specified addr
ess. For help enabling metadata publishing, please refer to the MSDN documentat
ion at http://go.microsoft.com/fwlink/?LinkId=65455.


WS-Metadata Exchange Error
URI: net.tcp://localhost:9100/mex

Metadata contains a reference that cannot be resolved: 'net.tcp://localhost:
9100/mex'.

There was no endpoint listening at net.tcp://localhost:9100/mex that could a
ccept the message. This is often caused by an incorrect address or SOAP action.
See InnerException, if present, for more details.

If you would like more help, type "svcutil /?"
GeneralRe: unable to generate proxy object
Faris Y. Elias SHOMOU
6:37 14 Dec '08  
Dear,

If you like to generate a proxy from a web service or from a WCF service, first of all you have to make this service available and listening for clients. Are you aware of that ?

If you host your WCF in a console application, you have to run this console application, and after that you can access a URL in order to generate a fresh copy of a proxy as below:
SvcUtil.exe net.tcp://localhost:9100/MEX  /out:proxy.cs

If you host your WCF inside IIS, this service is already listening if IIS is running, and then you generate a fresh copy of a proxy as below :
svcutil.exe http://localhost/FirstWcfIISHost/Service.svc    /out:proxy.cs

I hope this clarification will help you.

Regards,
Faris
GeneralRe: unable to generate proxy object
Rob Graham
16:18 15 Dec '08  
Faris Y. Elias SHOMOU wrote:
If you like to generate a proxy from a web service or from a WCF service, first of all you have to make this service available and listening for clients. Are you aware of that ?

Absolutely not true. .Net provides a tool (svcutil.exe) that can generate the proxy file from the binaries for the service and data contract. Both can be implementeted as DLLs. It is not necessary to run the service or expose the metadata endpoint.
GeneralRe: unable to generate proxy object
Faris Y. Elias SHOMOU
9:55 17 Dec '08  
I know that you can generate the proxy from a WCF DLL, this is an option, but it is not a good practice.

From my experience it’s better to generate the proxy from the wsdl and you have always a fresh copy of metadata (contracts) while adding new data , so you do not need an intermediate step (dll) to have your proxy.
GeneralRe: unable to generate proxy object
Rob Graham
7:51 18 Dec '08  
Faris Y. Elias SHOMOU wrote:
rom my experience it’s better to generate the proxy from the wsdl and you have always a fresh copy of metadata (contracts) while adding new data , so you do not need an intermediate step (dll) to have your proxy.

If there is no intention to expose the service to the outside world, it is a potential security risk to enable the meta data endpoint. Since svcutil.exe actually uses the xsd data contracts and the wsdl that it first creates from the dll containin the interface adefinitions for the service, and the data contract definitions to generate the proxy, the results are always consistent with the wsdl and with the current implementation in the service executable.
My main intention, however, was simply to correct the assertion that you had made, which suggested that the ONLY way to get the proxy code was to deploy and query the service metadata endpoint.
GeneralRe: unable to generate proxy object
Rob Graham
8:20 18 Dec '08  
Your original state ment was: "If you like to generate a proxy from a web service or from a WCF service, first of all you have to make this service available and listening for clients. Are you aware of that ?"
Which was not correct. I was pointing out that there is another approach available, one which may be preferable if the service is to be deployed only internally, or for security reasons, it is not desired to expose the metadata endpoint. Svcutil actually must first be used to create the XSD and WSDL for the service from the dll, these can then be used to generate a proxy. In any case, Svcutil will always generate a proxy that is in sync with the implementation (be it dll or exe). From a standpoint of maintainability and flexibility, I always implement the service as a class library dll, allowing it to be hosted as needed in either windows form, console exe, windows service, or IIS as needs may dictate. This also allows for hosting in a simple console based harness for initial unit testing. Also I don't see how you can say that with your approach you "don't need an intermediate step (dll)". Either way, you need to have a runnable binary implementation of the service, so it can hardly be viewed as an extra intermediate step.
GeneralProject files unavailable
Member 1617095
6:19 5 Dec '08  
One comment though.... the project files seem to be missing from the solution download and the file structure seems to include source control info...

Andreas
GeneralWell done
Member 1617095
6:04 5 Dec '08  
Very simple and clear description of the different WCF possibilities.

Thanks for posting,
Andreas
GeneralRe: Well done
Faris Y. Elias SHOMOU
9:32 5 Dec '08  
Thanks for your feedback.

Faris.
GeneralClarification
Ravi Bhavnani
8:20 10 Nov '08  
The table in the section "Multiple Host and Protocol Support with WCF" seems to imply the only protocols supported for WCF services hosted in Windows console and WinForms applications are tcp, pipe and msmq. As you're probably aware, these kinds of hosts also support http.

/ravi

My new year resolution: 2048 x 1536
Home | Articles | My .NET bits | Freeware ravib(at)ravib(dot)com

GeneralRe: Clarification
fshomou
8:35 10 Nov '08  
Of course, I'm aware, this is a mistake while I was posing my article.

Thank you for this remark, I’ll try to correct the table if it’s possible.

Faris.


Last Updated 15 Dec 2008 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2010