C# 在WCF服务中公开webHttpBinding终结点

C# 在WCF服务中公开webHttpBinding终结点,c#,wcf,wcf-binding,C#,Wcf,Wcf Binding,我创建了一个WCF服务,并公开了三个端点,即basicHttpBinding、wsHttpBinding和webHttpBinding。这是一个测试服务,用于我的WCF实验。但是,每当我使用.svc文件添加服务引用时,我只会得到两个(基本和ws)端点。由于某种原因,似乎没有第三个(webHttpBidning)端点被公开 要重现此问题,请创建WCF应用程序项目,删除Service1服务,添加名为TestService的新项>WCF服务,并将配置文件更改为以下内容: <system.serv

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

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

<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>
对于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文件中吗?

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

@decyclone:我成功地公开了webHttpBindings,没有任何问题。但是我发现了一些有趣的事情,当它暴露出来的时候,当它没有暴露出来的时候

我可以看到web绑定在Wcf测试客户端中被公开

这是我的配置

<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和框架3.5、VS2010和框架3.5都可以很好地工作,当我使用VS2010和框架4.0时,我看不到WebHttpBinding在WCF测试客户机中公开,但是我可以在所有情况下使用该binidng进行http post

我假设在Framework4.0中,默认情况下它是不可见的,即使我尝试启用endpointDiscovery,但仍然没有成功


我在我的

WebHttpBinding中介绍了这种行为,它位于System.ServiceModel.Web中。如果您使用的是vs2010,请转到项目的属性,检查目标框架。默认情况下,它指向.Net Framework 4客户端配置文件。它应该指向.Net Framework 4,然后您可以在添加引用时找到System.ServiceModel.Web:javascript客户端可以了解webHttpBinding上可用方法的一种方法是下载一个WCF javascript代理,其中HTML脚本标记指向您的端点,后跟“/js”:

,当只有一个端点使用webHttpBinding时,客户机如何知道哪些方法/类型是公开的?我实际上不知道(jQuery如何传输元数据)。可能是另一个问题。@decyclone:请参阅下面对后续问题的回答。
<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>