wcf service @ iis - svc可以访问,但wsdl链接不起作用

时间:2014-09-02 15:05:07

标签: c# wcf iis wsdl web-config

我写了一个wcf服务并将其部署在本地iis上没有任何问题。

本地系统:

  • windows 7 x64
  • iis 7.5

现在我尝试使用iis服务器在远程系统上部署我的服务。 我将service.svc,web.config和bin目录复制到另一个系统的文件夹中。

之后我将新应用程序添加到默认网站并将其链接到包含我的文件的文件夹。我打开浏览器尝试访问svc文件。

使用两个wsdl链接显示

文件是正确的,但是当我点击网址更改但网站不更改的链接时。在远程系统和本地客户端上尝试了这个。在两个系统上都是相同的。

远程系统:

  • Windows server 2012 r2 x64
  • iis 8.5

我做了什么:

  • 添加了启用服务元数据的服务行为
  • 在该服务元数据行为上设置httpGetEnabled = True以允许http浏览到该元数据
  • 在我的服务上添加了mex端点

这是我的web.config:

<system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior name="MetadateBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="True"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<services>
  <service
    behaviorConfiguration="MetadateBehavior"
    name="ServerLib.Handler.WcfReciveHandler">
    <endpoint 
      address=""
      binding="wsDualHttpBinding"
      contract="Common.Contracts.IServerContract" />
    <endpoint
      address="mex"
      binding="mexHttpBinding"
      contract="IMetadataExchange" />
  </service>
</services>

我在这里找到了类似的帖子,但没有回答我的问题。 (WCF hosting: Can access svc file but cannot go to wsdl link)。

我启用了对我的服务的跟踪,但到目前为止还没有创建日志。所以我认为该服务没有运行。在我的本地系统上创建了。

我尝试使用svc文件的url向我的客户端项目添加服务引用,但这结束时出现错误:

  

下载'\ http://dev.develop.local/asd/Service.svc/_vti_bin/ListData.svc/$metadata'时出错。请求失败,HTTP状态为404:未找到。元数据包含无法解析的引用:

后面跟着html文档 - 想想我访问svc文件时显示的文件。

我已经在远程系统上检查了我的应用程序事件日志,并注意到我试图添加服务引用时似乎写的以下错误:

  

WebHost无法处理请求。    发件人信息:System.ServiceModel.Activation.HostedHttpRequestAsyncResult / 24984138    例外:System.Web.HttpException(0x80004005):没有频道主动收听“https://dev.develop.local/asd/Service.svc/mex”。这通常是由错误的地址URI引起的。确保将消息发送到的地址与服务正在侦听的地址匹配。 ---&GT; System.ServiceModel.EndpointNotFoundException:没有频道主动收听'https://dev.develop.local/asd/Service.svc/mex'。这通常是由错误的地址URI引起的。确保将消息发送到的地址与服务正在侦听的地址匹配。      在System.ServiceModel.Activation.HostedHttpTransportManager.HttpContextReceived(HostedHttpRequestAsyncResult result)

我希望有人可以提供帮助。

3 个答案:

答案 0 :(得分:0)

您缺少“wsDualHttpBinding”的连接绑定的配置部分。您需要在bindingConfiguration元素中添加endpoint属性,并将其指向binding配置元素。

它看起来应该是这样的(这是wsHttpBinding而不是wsDualHttpBinding):

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:30:00" sendTimeout="00:30:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="524288"
                messageEncoding="Text" textEncoding="utf-8"
                useDefaultWebProxy="true">
      <reliableSession enabled="true" ordered="true"/>
      <readerQuotas maxDepth="32" maxStringContentLength="52428800" maxArrayLength="52428800"
                    maxBytesPerRead="52428800" maxNameTableCharCount="52428800" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="None" algorithmSuite="Default" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

答案 1 :(得分:0)

感谢ofadflakz。我终于明白了。 有几个问题。你的回答有助于他们中的一个(第2点)。

  • 我发布服务的服务器和网站只接受https,我的服务不通过https提供元数据。解决方案是将httpsGetEnabled添加到我的serviceMetadata。

    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
    

    这是未正确加载的wsdl文件的主要问题。添加之后,一切都很顺利,但通信失败 - 收到的异常指向身份验证问题 - &gt;那点2

  • wsDualHttpBinding需要像toadflakz所说的bindingConfiguration。至少是不需要安全模式的信息。我的绑定配置看起来像这样。

    <wsDualHttpBinding>
      <binding name="wsHttpDual">
        <security mode="None">
          <message clientCredentialType="None" algorithmSuite="Default" />
        </security>
      </binding>
    </wsDualHttpBinding>
    

    之后,我为我的服务添加了一个新网站,在非常高的端口上收听http请求。客户似乎做了一些事情,但恢复了暂停。我将端口添加到服务器防火墙上的传入连接但这还不够 - 让我遇到问题3.

  • 我的通信被客户端防火墙阻止了。我添加了服务器ip clientside - 现在工作正常。

答案 2 :(得分:0)

重新启动视觉工作室解决了我的问题,我知道它很奇怪,但是对于那些已经尝试过所有但仍然失败的人,只需尝试重新启动visual studio。希望它有所帮助。