WCF:如何在没有WSDL的情况下生成单个WSDL文档:import?

时间:2009-06-12 06:53:52

标签: wcf web-services wsdl namespaces

我遇到了一个问题...... 我正在尝试找到一种方法从我的WCF服务生成单个wsdl文档,即没有任何外部文档的链接。 我使用FlatWsdl删除了所有xsd:import链接,我生成的wsdl仍然包含一个通过wsdl:import声明的外部wsdl文档的链接:

<wsdl:import namespace="http://myurl/mynamespace"  
             location="http://myserver/myservice.svc?wsdl=wsdl0"/>  

这个文档实际上包含了所有内联的xsd模式,所以...有一种方法可以内联这个外部的wsdl文档,以便有一个单独的wsdl?

非常感谢任何帮助。

7 个答案:

答案 0 :(得分:19)

您现在可以在.net 4.5(测试版)中本机执行此操作。有一个选项(?singleWsdl而不是?wsdl)用于告诉服务在单个wsdl文档中输出所有内容。有关新内容的更多信息,请访问:http://msdn.microsoft.com/en-us/library/dd456789(v=vs.110).aspx

答案 1 :(得分:13)

(编辑:关于FlatWSDL的先前答案被删除,因为正如你所指出的那样是关于消除xsd:import而不是wsdl:import。)

请看这篇博文:Control generated WSDL in WCF

“......总是为一个目标名称空间URI生成一个WSDL ......”

ServiceContract,DataContract,ServiceBehavior等有不同的命名空间吗?

答案 2 :(得分:4)

您还可以使用它具有扩展名的WCFExtras项目来创建单个WSDL文件。

  

<强> WCFExtras

     

有用的WCF扩展的集合   包括Soap Header支持,WSDL   文档等等。

     

WCF平台非常易于扩展   并允许您轻松添加功能   这不是核心产品的一部分。   该项目包含一些扩展   我需要一个基于WCF的项目:

     
      
  • WCF添加WSDL的SOAP标头支持
  •   
  • 源代码XML注释中的文档
  •   
  • 覆盖SOAP地址位置URL
  •   
  • 单个WSDL文件,以便与旧的SOAP工具更好地兼容。
  •   

http://wcfextras.codeplex.com/

答案 3 :(得分:2)

我的问题出在端点定义中,即tempuri.org命名空间 将bindingNamespace添加到端点声明可以解决我的问题。 感谢所有人的帮助:))

答案 4 :(得分:1)

您需要添加一些额外的行为等。

请在此处查看这些文章:

http://my-tech-talk.blogspot.com/2008/07/adding-flatwsdl-to-wcf-webservice.html

http://blogs.thinktecture.com/cweyer/archive/2007/05/10/414840.aspx

实现这一目标有几种不同的方式。

马克

答案 5 :(得分:1)

这是一个迟到的答案,但我的一些WCF服务遇到了同样的问题。如果您使用的是.NET 4.5,就像之前的回答一样,请使用?singleWSDL,但如果您不是针对.NET 4.5,那么我将以下内容添加到我的web.config中以解决问题......

<useRequestHeadersForMetadataAddress>
  <defaultPorts>
    <add port="80" scheme="http" />
    <add port="443" scheme="https" />
  </defaultPorts>
</useRequestHeadersForMetadataAddress>

这就是你的行为。这样我就不必压扁WSDL,因为所有引用都是MyURL而不是MyServer。

希望这可以帮助处理类似问题的其他人。

答案 6 :(得分:0)

除了Jim上面的回答,如果您使用C#代码直接配置WCF ServiceHost:

using System.ServiceModel.Configuration;

以及设置ServiceHost时:

UseRequestHeadersForMetadataAddressBehavior urh = new UseRequestHeadersForMetadataAddressBehavior();
serviceHost.Description.Behaviors.Add(urh);

我努力在网上找到这些信息,就像它一样简单。希望能帮助处于类似情况的人。