我正在尝试使用WCF构建Web服务。由于该服务最终将由非.NET语言使用,我一直在尝试使用“添加Web引用”或使用WSDL.exe而不是svcutil方式对其进行测试。我一直遇到以下错误:
来自WSDL.exe - 错误:无法从命名空间http://tempuri.org导入绑定BasicHttpBinding_IEchoService。 - - 无法导入操作Echo。 - - 缺少元素http://tempuri.org/:Echo。
从“添加服务引用”和“添加Web引用”: 元数据包含无法解析的引用:链接到wsdl 。 WSDL文档包含无法解析的链接。下载http://localhost:8080/EchoService.svc?xsd=xsd0时出错 基础连接已关闭。
此简化示例与主要服务具有相同的问题。
这是服务的Web.Config:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="EchoBehaviorConfiguration">
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<services>
<service name="EchoService">
<endpoint address=""
behaviorConfiguration="EchoBehaviorConfiguration"
binding="basicHttpBinding"
contract="IEchoService" />
<endpoint address="mex" contract="IMetadataExchange" binding="mexHttpBinding" />
</service>
</services>
<bindings>
<basicHttpBinding>
</basicHttpBinding>
<mexHttpBinding></mexHttpBinding>
</bindings>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
这是合同/界面:
[ServiceContract]
public interface IEchoService
{
[OperationContract]
string Echo(string message);
}
这是生成的WSDL:
<wsdl:definitions name="EchoService" targetNamespace="http://tempuri.org/">
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import schemaLocation="http://localhost:8080/EchoService.svc?xsd=xsd0" namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="http://localhost:8080/EchoService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="IEchoService_Echo_InputMessage">
<wsdl:part name="parameters" element="tns:Echo"/>
</wsdl:message>
<wsdl:message name="IEchoService_Echo_OutputMessage">
<wsdl:part name="parameters" element="tns:EchoResponse"/>
</wsdl:message>
<wsdl:portType name="IEchoService">
<wsdl:operation name="Echo">
<wsdl:input wsaw:Action="http://tempuri.org/IEchoService/Echo" message="tns:IEchoService_Echo_InputMessage"/>
<wsdl:output wsaw:Action="http://tempuri.org/IEchoService/EchoResponse" message="tns:IEchoService_Echo_OutputMessage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="BasicHttpBinding_IEchoService" type="tns:IEchoService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="Echo">
<soap:operation soapAction="http://tempuri.org/IEchoService/Echo" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="EchoService">
<wsdl:port name="BasicHttpBinding_IEchoService" binding="tns:BasicHttpBinding_IEchoService">
<soap:address location="http://localhost:8080/EchoService.svc"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
该服务目前通过IIS7在本地托管。我尝试了HTTP和HTTPS并且遇到了同样的问题。如果我尝试将basicHttpBinding的绑定改为webHttpBinding,那么WSDL中没有任何变化。
关于我哪里出错的任何想法?
更新: 我现在的配置设置如果服务在Cassini而不是IIS下运行,我可以添加服务或Web引用到我的测试项目。我无法保存wsdl并使用WSDL.exe来生成代理类。
所以现在我有3个问题:
除了使用aspnet_regiis安装和注册带有IIS的WCF 4之外,我还有什么需要做的吗?
知道我需要做些什么才能让它与WSDL.exe一起使用?
在完成ASMX服务并比较生成的WSDL之后,它们有很大的不同,这使我怀疑WCF在这一点上与非.NET语言的兼容性。
答案 0 :(得分:3)
由于WSDL中使用了?xsd = xsd0,我遇到了同样的问题。我发现这个链接提供了这个解决方案:
http://merill.net/2008/04/wcf-add-service-reference-gotcha-with-windows-server/
答案 1 :(得分:1)
您似乎没有在正确的位置指定行为名称
http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.aspx
结果是httpGet未启用元数据。
答案 2 :(得分:0)
根据您的示例,我认为您可以简化配置。
例如,如果你有wsdl的enpoint声明中的.svc文件,你可以拥有:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
然后你应该能够通过url http://localhost:8080/EchoService.svc访问它(假设它在本地机器上并侦听端口8080.只是认为Tomcat有时使用8080作为其默认端口....)