代码之家  ›  专栏  ›  技术社区  ›  decyclone

在wcf服务中公开webhttpbinding终结点

  •  9
  • decyclone  · 技术社区  · 14 年前

    我创建了一个WCF服务并公开了三个端点,分别是basichttpbinding、wshttpbinding和webhttpbinding。这是我使用WCF进行的实验的测试服务。但是,每当我使用.svc文件添加服务引用时,我只得到两个(basic和ws)端点。似乎没有第三个端点(webhttpbiding)出于某种原因被公开。

    若要重现此问题,请创建一个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>
    

    以下是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 回复  |  直到 9 年前
        1
  •  5
  •   IBhadelia    14 年前

    @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和Framework 3.5、VS2010和Framework 3.5都可以很好地工作,当我使用VS2010和Framework 4.0时,我看不到Webhttpbinding在WCF测试客户端中被公开,但是我可以在所有情况下使用该binidng来做HTTP发布。

    我假设在框架4.0中,默认情况下它是不可见的,即使我尝试启用EndpointDiscovery,但仍然没有运气!

    我在我的 post

        2
  •  2
  •   Henk Holterman    14 年前

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

        3
  •  0
  •   Zaid Bin Irfan    10 年前

    webhttpbinding位于system.serviceModel.web中。如果您使用的是VS2010,请转到项目的属性,检查目标框架。默认情况下,它指向.NET Framework 4客户端配置文件。它应该指向.NET Framework 4,然后您可以在转到“添加引用”时找到System.ServiceModel.Web。

        4
  •  0
  •   BillVo    9 年前

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