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

WCF Web服务-无法生成代理类

  •  1
  • JamesEggers  · 技术社区  · 14 年前

    我正在尝试使用WCF构建Web服务。由于该服务最终将被非.NET语言使用,因此我一直尝试使用“添加Web引用”或使用wsdl.exe而不是svcutil方法来测试它。不过,我发现了以下错误:

    来自WSDL.exe -错误:无法从命名空间导入绑定basichttpbinding\u iechoservice http://tempuri.org . --无法导入操作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生成代理类。

    所以现在我有三个问题:

    1. 除了通过aspnet注册在IIS上安装和注册wcf 4之外,我还需要做什么?

    2. 知道我需要做什么才能让它与wsdl.exe一起工作吗?

    3. 在做了一个asmx服务并比较了生成的wsdl之后,它们有着显著的不同,这让我怀疑目前wcf与非.NET语言的兼容性如何。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Eric Faust    13 年前

    我也有同样的问题吗?在WSDL中使用的xsd=xsd0。我找到了这个链接,它给出了这个解决方案:

    • 当您在csc.exe进程(这是生成xsd的编译器)上释放武器(进程监视器)时,您将认识到IIS标识IIS_wpg没有访问windows\temp文件夹的权限。给文件夹足够的权限,Viola问题就解决了。

    http://merill.net/2008/04/wcf-add-service-reference-gotcha-with-windows-server/

        2
  •  1
  •   Shiraz Bhaiji    14 年前
        3
  •  0
  •   Bryce Fischer    14 年前

    <system.serviceModel>
      <behaviors>
        <serviceBehaviors>
          <behavior>
            <serviceMetadata httpGetEnabled="true"/>
            <serviceDebug includeExceptionDetailInFaults="false"/>
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    </system.serviceModel>
    

    http://localhost:8080/EchoService.svc