Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Expose webHttpBinding endpoint in a WCF service

I created a WCF service and exposed three endpoints which are basicHttpBinding, wsHttpBinding and webHttpBinding. This is a test service for my experiments with WCF. But, whenever I add service reference using the .svc file, I only get two (basic and ws) endpoints. There doesn't seem to be a third (webHttpBidning) endpoint being exposed for some reason.

To reproduce this issue, create a WCF application project, delete the Service1 service, add new item > WCF service named TestService, and change the config file to the following :

<system.serviceModel>
<services>
  <service name="WcfTestService.TestService" behaviorConfiguration="TestServiceBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost/WcfTestService/TestService.svc"/>
      </baseAddresses>
    </host>
    <endpoint address="basic"
              binding="basicHttpBinding"
              contract="WcfTestService.ITestService" />
    <endpoint address="ws"
              binding="wsHttpBinding"
              contract="WcfTestService.ITestService" />
    <endpoint address="web"
              binding="webHttpBinding"
              contract="WcfTestService.ITestService" />
    <endpoint address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="TestServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="webBehavior">
      <webHttp />
    </behavior>
  </endpointBehaviors>
</behaviors>

Here is the code for ITestService.cs:

[ServiceContract]
public interface ITestService
{
    [OperationContract]
    [WebInvoke]
    Boolean ValidateUser(User user);
}

[DataContract]
public class User
{
    [DataMember(Name = "Name")]
    public String UserName { get; set; }
    [DataMember]
    public String Password { get; set; }
}

and for TestService.svc

public class TestService : ITestService
{
    public bool ValidateUser(User user)
    {
        if (user.UserName == "User" && user.Password == "123")
        {
            return true;
        }
        return false;
    }
}

I tried different combination of WebInvoke parameters and WebGet parameters, but failed.

Can anyone tell me why the third endpoint is not showing up in the WSDL file?

like image 400
decyclone Avatar asked Jun 14 '10 09:06

decyclone


2 Answers

@decyclone: I have successfully exposed webHttpBindings without any issue. But I found some interesting thing when it get exposed and when it not!

I can see web binding getting exposed in Wcf Test Client.

Here are my configurations

<services>
  <service behaviorConfiguration="TestWeb.Service2Behavior" name="TestWeb.Service2">
    <endpoint address="" binding="wsHttpBinding" contract="TestWeb.Service2">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="web" binding="webHttpBinding" contract="TestWeb.Service2">
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>

Point to note here is, its working fine using VS2008 with Framework 3.5, VS2010 with Framework 3.5, when I use VS2010 and Framework 4.0 then I can't see WebHttpBinding getting exposed in WCF Test Client, however I can use that binidng to do http post in all cases.

I assume that in Framework 4.0 its not visible by default, even I try enable endpointDiscovery but still no luck!

I have covered this behaviour in my post

like image 91
IBhadelia Avatar answered Sep 28 '22 03:09

IBhadelia


Your "web" endpoint will be exposed as a JSON endpoint. It is not compatible with WSDL.

like image 28
Henk Holterman Avatar answered Sep 28 '22 03:09

Henk Holterman