【发布时间】:2011-12-03 01:43:40
【问题描述】:
TL;DR 版本在底部。
我已经构建了三个 WCF Web 服务——一个使用 .NET 4,两个使用 .NET 3.5——由 Android 客户端使用。 Android 客户端使用 ksoap2-android 执行调用。当服务完成并且客户端可以进行所有调用并从服务中获取所有数据时,我们决定为 Web 服务激活 HTTPS 通信。它们托管在运行 IIS 的服务器上。
我并不孤单。我全职工作,主要是 Android 客户端。我有两个同事,他们都有很多其他的职责。第一个主要涉及服务,第二个主要涉及服务器。
我在 Internet 上阅读了很多关于如何为 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 绑定。 p>
好的,到目前为止,一切都很好。现在我们可以连接到浏览器中的服务了。
完成此操作后,就可以在浏览器中以安全、加密的方式访问服务。
问题是在 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 Continue 作为响应,之后它会发布正文。这应该是正常行为。但随后服务返回 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://[my address]”而不是“https://[my address]”),尽管它被配置为调用 https 地址。服务返回 404 Not Found。如果我将服务的地址设置为 https 并将 listenUri 设置为 http,我会得到 405 Method Not Allowed。如果我反过来说它不能被激活。我错过了什么?
【问题讨论】: