WCF Web服务 - 无法构建代理类

时间:2010-10-04 15:08:38

标签: .net wcf

我正在尝试使用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个问题:

  1. 除了使用aspnet_regiis安装和注册带有IIS的WCF 4之外,我还有什么需要做的吗?

  2. 知道我需要做些什么才能让它与WSDL.exe一起使用?

  3. 在完成ASMX服务并比较生成的WSDL之后,它们有很大的不同,这使我怀疑WCF在这一点上与非.NET语言的兼容性。

3 个答案:

答案 0 :(得分:3)

由于WSDL中使用了?xsd = xsd0,我遇到了同样的问题。我发现这个链接提供了这个解决方案:

  • 当您在csc.exe进程(这是生成xsd的编译器)上释放武器(进程监视器)时,您将意识到IIS身份IIS_WPG无法访问Windows \ Temp文件夹。给予文件夹足够的权利,解决了中提问题。

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作为其默认端口....)