在WCF服务中公开webHttpBinding端点

时间:2010-06-14 09:03:52

标签: c# wcf wcf-binding

我创建了一个WCF服务并公开了三个端点,即basicHttpBinding,wsHttpBinding和webHttpBinding。这是我使用WCF进行实验的测试服务。但是,每当我使用.svc文件添加服务引用时,我只获得两个(基本和ws)端点。似乎没有第三个(webHttpBidning)端点由于某种原因被暴露。

要重现此问题,请创建WCF应用程序项目,删除Service1服务,添加新项目> WCF服务名为TestService,并将配置文件更改为以下内容:

<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>

以下是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; }
}

和TestService.svc

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

我尝试了WebInvoke参数和WebGet参数的不同组合,但都失败了。

有人能告诉我为什么第三个端点没有出现在WSDL文件中吗?

4 个答案:

答案 0 :(得分:5)

@decyclone:我已成功公开webHttpBindings而没有任何问题。但是当它暴露出来时我发现了一些有趣的东西,当它没有暴露时!

我可以看到Web绑定在Wcf Test Client中公开。

以下是我的配置

<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>

这里需要注意的是,它使用VS2008和Framework 3.5,VS2010和Framework 3.5,当我使用VS2010和Framework 4.0然后我看不到WebHttpBinding在WCF测试客户端中暴露,但是我可以使用那个binidng在所有情况下都要做http帖子。

我认为在Framework 4.0中默认情况下不可见,即使我尝试启用endpointDiscovery但仍然没有运气!

我已在post

中介绍了此行为

答案 1 :(得分:2)

您的“Web”端点将作为JSON端点公开。它与WSDL不兼容。

答案 2 :(得分:0)

WebHttpBinding位于System.ServiceModel.Web中。如果您使用的是vs2010,请转到项目的属性,检查目标框架。默认情况下,它指向.Net Framework 4 Client Profile。它应该指向.Net Framework 4,然后你可以在添加引用时找到System.ServiceModel.Web

答案 3 :(得分:0)

@decyclone:javascript客户端可以学习webHttpBinding上可用方法的一种方法是下载一个WCF javascript代理,其中HTML脚本标记指向您的端点,后跟“/ js”:<script src="http://localhost/WcfTestService/TestService.svc/web/js"></script>