WCF SOAP over HTTPS,WCF测试客户端调用http地址,服务器响应404

时间:2011-10-07 14:28:16

标签: wcf iis soap https

TL; DR版本位于底部。

我已经构建了三个WCF Web服务 - 一个使用.NET 4,另一个使用.NET 3.5 - 由Android客户端使用。 Android客户端使用kso​​ap2-android执行调用。当服务完成并且客户端可以进行所有调用并从服务获取所有数据时,我们决定为Web服务激活HTTPS通信。它们托管在运行IIS的服务器上。

我并不孤单。我全职工作,主要是Android客户端。我有两个同事,他们都有很多其他的责任。第一个主要涉及服务,第二个主要涉及服务器。

我在互联网上阅读了很多关于如何为WCF Web服务启用HTTPS的指南,博客和文章,但我仍然无法完全解决这个问题。为了让Android客户端能够使用客户端,我们仅限于使用basicHttpBinding,因为wsHttpBinding包含一些Android不支持的安全细节,或者其他东西。我不确定,但我在某个地方看了一些论坛。如果我错了,我会很高兴得到纠正!

好的,所以我会简要介绍一下到目前为止我所做的事情:

启用了传输安全性,这就是绑定的外观:

<bindings>
  <basicHttpBinding>
    <binding name="basicHttp" closeTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00">
      <security mode="Transport">
        <transport clientCredentialType="None" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

我使用以下代码启用了基于HTTPS的元数据发布

<serviceMetadata httpsGetEnabled="true" />

和此:

<endpoint address="" binding="mexHttpsBinding" contract="IMetadataExchange" />

此外,我的第二位同事已在IIS服务器上安装了受信任的证书(来自CA的真实证书),并且在服务器上添加了https绑定

好的,到目前为止,这么好。现在我们可以在浏览器中连接到服务。

当我们这样做时,可以以安全,加密的方式在浏览器中访问该服务。

问题是无法在Android和WCF测试客户端中调用该服务。如果我在https地址上呼叫该服务,我会收到404响应。 WCF测试客户端返回:

There was no endpoint listening at https://[my service address] that could accept the message. This is often caused by an incorrect address or SOAP action.

为了能够调试这个,我正在使用Wireshark拦截消息,看看到底发生了什么。我发现在设置程序(握手,建立信任等)之后,客户端发送标题并获得101继续作为响应,之后它发布主体。这应该是正常的行为。但随后该服务返回404 Not Found。 Wireshark说完整的请求URI是http地址。我已将服务器配置为使用https地址,那么为什么要调用http地址?

我已尝试将端点的地址和listenUri属性分别设置为https和http,反之亦然。如果我这样做,服务器将使用405 Method Not Allowed来回答请求。

有什么方法可以解决这个问题吗?我错过了什么?

我错过了什么?

TL; DR版本

我正在使用IIS托管三个WCF SOAP Web服务,一个使用.NET 4,另一个使用.NET 3.5。我正在尝试通过HTTPS从WCF测试客户端拨打电话。我已经启用了传输安全性,通过HTTPS发布元数据,安装了可信证书并在服务器上添加了https绑定。

当我尝试从WCF测试客户端拨打电话时,它表示没有端点正在侦听该地址。 Wireshark告诉我它调用http版本的服务(即“http:// [我的地址]”而不是“https:// [我的地址]”),虽然它被配置为调用https地址。该服务返回404 Not Found。如果我将服务的地址设置为https并将listenUri设置为http,则会获得405 Method Not Allowed。如果我这样做,反过来说它无法激活。我错过了什么?

1 个答案:

答案 0 :(得分:0)

我通过删除端点并使用<protocolMapping>标记解决了这个问题,如下所示:

<protocolMapping>
  <add scheme="https" binding="basicHttpBinding" bindingConfiguration="basicHttps" />
</protocolMapping>