【问题标题】:After creating a wcf service how do I tell whether its restful or soap from the wsdl?创建 wcf 服务后,我如何从 wsdl 中判断它是 restful 还是 soap?
【发布时间】:2011-06-20 16:05:56
【问题描述】:

我创建了一个服务,然后我看到一个页面说:

您已经创建了一个服务。

要测试此服务,您需要 创建一个客户端并使用它来调用 服务。您可以使用 命令行中的 svcutil.exe 工具 语法如下:

但是我如何判断它是 SOAP 还是 REST 服务呢?我如何从 wsdl 等中得知?

服务配置:

<services> 
    <service name="VLSContentService"
             behaviorConfiguration="VLSContentServiceBehaviour" > 
        <endpoint name="rest" 
            address="" 
            behaviorConfiguration="VLSContentServiceEndpointBehaviour" 
            binding="webHttpBinding" 
            contract="IVLSContentServiceREST" /> 
        <endpoint name="soap" 
            address="soap" 
            binding="basicHttpBinding" 
            contract="IVLSContentServiceREST"/> 
    </service> 
</services>

更新:

嗨,马克,

我的配置是:

 <services>
      <service behaviorConfiguration="VLSContentServiceBehaviour" name="VLSContentService">
        <endpoint name="rest" address="" behaviorConfiguration="VLSContentServiceEndpointBehaviour" binding="webHttpBinding" contract="IVLSContentServiceREST" />
        <endpoint name="soap" address="soap" binding="basicHttpBinding" contract="IVLSContentServiceREST"/>
      </service>
    </services>

所以基本上我浏览到 .svc 文件并看到一个 wsdl 的链接。但是我怎么知道那是针对 SOAP 还是 REST 端点。我是否正确配置了它?

谢谢

更新时间:17:49(英国时间)

<system.serviceModel>

  <!---Add the service-->
  <services>
    <service behaviorConfiguration="VLSContentServiceBehaviour" name="VLSContentService">
       <endpoint name="rest" 
           address="" 
           behaviorConfiguration="VLSContentServiceEndpointBehaviour" 
           binding="webHttpBinding" 
           contract="IVLSContentServiceREST" />
    </service>
 </services>
 <!---Add the behaviours-->
 <behaviors>
    <serviceBehaviors>
       <behavior name="VLSContentServiceBehaviour">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
       </behavior>
    </serviceBehaviors>
    <endpointBehaviors>
       <behavior name="VLSContentServiceEndpointBehaviour">
         <webHttp />
       </behavior>
    </endpointBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="false" />
</system.serviceModel>

ma​​rc_s 更新:18:22(英国时间)

Pete,试试这个 - 没有元数据发布,什么都没有 - 只是 webHttpBinding - 你应该不要再看到任何 WSDL...

<system.serviceModel>
   <services>
      <service name="VLSContentService">
          <endpoint name="rest" 
              address="" 
              binding="webHttpBinding" 
              contract="IVLSContentServiceREST" />
      </service>
   </services>
   <serviceHostingEnvironment aspNetCompatibilityEnabled="false" />
</system.serviceModel>

【问题讨论】:

  • 完全没有 WSDL 的 RESTful!
  • 是的,显然您得到了一个 WSDL - 因为您在服务配置中定义了一个 SOAP 端点 (name=soap)! 尝试不使用 basicHttpBinding 端点 - 您将不会仅获取 REST 端点的 WSDL。
  • 嗨,Marc_s,我想我们现在已经把我们的电线交叉了。我实际上已经取出了 SOAP 配置,但仍然得到了一个 wsdl。 Carlos 在下面的帖子中说这是因为我有
  • 您仍然拥有元数据端点!您启用了“元数据交换”——这将发布一个 SOAP 端点....

标签: c# wcf rest soap


【解决方案1】:

服务可以是 REST 和 SOAP,WCF 服务 可以有多个端点,包括两者的混合 SOAP 和 REST。在 WSDL 上,SOAP 端点将显示在 wsdl:definitions/wsdl:service/wsdl:port 元素中; REST 端点不会。因此,如果服务中只有一个端点,如果 WSDL 中有一个 wsdl:port 条目,那么它就是一个 SOAP 端点;否则就是 REST。

您可以运行下面的代码并查看 wsdl,发现它只显示了一个 wsdl:port 元素,用于 SOAP 端点。

public class StackOverflow_6414181
{
    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        [WebGet]
        string Echo(string text);
    }
    public class Service : ITest
    {
        public string Echo(string text)
        {
            return text;
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
        host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), "soap");
        host.AddServiceEndpoint(typeof(ITest), new WebHttpBinding(), "rest").Behaviors.Add(new WebHttpBehavior());
        host.Open();
        Console.WriteLine("Host opened");

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}

【讨论】:

  • 欢呼卡洛斯,我正在讨论为什么当我删除 SOAP 绑定时 wsdl 仍然出现。应该吗?
  • [我假设您的意思是您删除了 SOAP endpoint,而不仅仅是绑定] 好吧,您启用了它( ),因此它将为您的服务创建一个 WSDL 文档。这不是很常见,但是想要为纯 REST 服务使用 WSDL 的原因之一是 WSDL 包含数据协定定义(如果使用 svcutil 将生成)。但是,服务合同可能不正确(因为 UriTemplate / WebGet / BodyStyle / 等内容不会出现在 WSDL 中)。
【解决方案2】:

如果您拥有 WSDL - 它就是 SOAP 服务。

REST 没有 WSDL。

REST 有一个类似的概念,称为 WADL - Web 应用程序描述语言 (WADL specification as PDF) - 但它不像 SOAP 的 WSDL 那样成熟和广泛使用。

【讨论】:

  • 嗨,对不起,当我用 c# 创建一个 REST WCF 服务时,它实际上创建了一个 wsdl。它在屏幕上。
  • 嗨,这里是:
  • @pete2k:嗯,是的 - 你的服务中有 一个 SOAP 端点 - 所以显然你会得到一个 WSDL - 用于 那个 SOAP 端点! - 但是没有 REST 端点 - 如果您只有 REST 端点,就不会有 WSDL。我的观点是:如果你只有一个 REST 端点,就没有 WSDL,因为 REST 不处理 WSDL。
  • @Pete2k - &lt;endpoint name="soap" address="soap" binding="basicHttpBinding" contract="IVLSContentServiceREST"/&gt; 定义了一个 SOAP 端点,因此您有一个 WSDL。马克是正确的,如果你有一个 WSDL,那么 WCF 要么认为它是一个 SOAP 服务,要么它被告知要发布 SOAP WSDL(通过拥有一个 MEX 端点)。
  • @Pete2k - 如果您已按照您的说明“取消了 REST 端点的绑定”,那么这意味着您只剩下 SOAP 端点,因此您仍然有一个 WSDL。你的意思是相反的吗?您删除了 SOAP 端点,只在配置中留下了 REST 端点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2011-11-03
  • 2012-07-16
相关资源
最近更新 更多