gpt4 book ai didi

调用 WCF 的 Java 应用程序返回 "Connection Reset",而 SoapUI 工作正常

转载 作者:行者123 更新时间:2023-11-30 05:36:55 25 4
gpt4 key购买 nike

我有一个 C# MVC 应用程序 (.NET Framework 4.6.2),其 WCF(基于肥皂)Web 服务位于应用程序内的/webservice 处。 WCF Web 服务供第三方供应商调用并向其推送数据。我们将该应用程序放在 Windows Server 2016 服务器上的测试环境中,端口 80 和 443 打开,并且我们的证书不是自签名且有效的。当我们使用 SoapUI 测试服务时,我们能够正确访问 WCF Web 服务并将测试数据发布到服务器,但是当我们的供应商从其 Java 应用程序发布数据时,他们会得到“连接重置”。我们已经删除了所有身份验证,只是试图让它们到达 WCF,但我们的 IIS 日志和应用程序日志甚至没有显示它们访问了我们的服务器。 SoapUI(在我们的网络/防火墙内部和外部)能够正确访问该服务。我们的 web.config 如下所示:

<system.serviceModel>
<diagnostics>
<messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="3000"/>
</diagnostics>
<bindings>
<basicHttpBinding>
<binding name="basicBinding" textEncoding="utf-8" openTimeout="00:03:00" closeTimeout="00:03:00"/>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="serviceBehavior" name="WebServiceUniqueName">
<endpoint address="/endpoint/soap" binding="basicHttpBinding" bindingConfiguration="basicBinding" name="soapEndpoint" bindingNamespace="https://test.site.com/webservice" contract="Our.Namespace.ISoapContract"/>
<endpoint address="mex" binding="mexHttpBinding" name="mexEndpoint" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="/webservice/servicename"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehavior">
<serviceMetadata externalMetadataLocation="https://test.site.com/webservice/content.xml"
httpGetEnabled="true" />
<serviceDebug httpHelpPageEnabled="false" includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>

我们的 WCF 代码如下所示:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(Namespace = "https://test.site.com/webservice")]
public class MyService : ISoapContract
{
public DataResponse SubmitData(DataRequest input)
{
// Code here
}
}

namespace Our.Namespace
{
[ServiceContract(Namespace = "https://test.site.com/webservice")]
[XmlSerializerFormat]
public interface ISoapContract
{
[OperationContract(Name = "SubmitData")]
[XmlSerializerFormat]
DataResponse SubmitData(DataRequest input);
}
}

我们的服务器使用 TLS 1.2,并回退到 1.1(正是供应商所期望的)。我们的防火墙没有显示任何内容被阻止,并且“连接重置”消息出现在他们请求的最初几秒钟内。第 3 方能够从他们的浏览器访问 WSDL,因此所有这些都让我相信握手过程中出现了问题。 SoapUI 即将推出并且在 Java 上运行,所以我们现在真的很困惑。 Java 调用 C# WCF 应用程序是否需要额外的东西?有没有办法捕获握手尝试?

更多测试后更新:

我们采纳了 Sambit 的建议并使用了 Microsoft Web 服务客户端,并且没有任何问题。我们创建了另一个测试 WCF,还创建了一个调用我们的服务器的应用程序,并将两者都放入 Azure 中,没有任何问题。我们可以访问我们的网络服务,但供应商仍然无法访问服务器。我们添加了更多日志记录并查看了防火墙,来自供应商的流量正在穿过防火墙并到达服务器,但报告“TCP 从服务器重置”。

第 3 方供应商的应用程序托管在共享环境中,他们能够在其服务器上运行命令,但无法更改任何代码来记录额外信息。他们能够 ping 我们的服务器并运行以下命令:

nc -zv (server_url) 443

连接成功,但当他们尝试从服务器获取证书时,失败了:

openssl s_client -tls1_2 -showcerts -connect (server_url):443

CONNECTED(00000003) write:errno=104

--- no peer certificate available

--- No client certificate CA names sent

最佳答案

经过双方很多非常聪明的人的帮助,问题最终是服务器名称指示(SNI):

https://en.wikipedia.org/wiki/Server_Name_Indication

供应商的应用程序正在运行旧版本的 Java,该版本不理解/支持 SNI,因此目前无法升级。

我们的服务器管理员在 Windows Server 上为供应商调用的域专用了一个 IP,并为该特定域禁用了 SNI。我们现在可以毫无问题地接收供应商的 Web 服务器调用。

关于调用 WCF 的 Java 应用程序返回 "Connection Reset",而 SoapUI 工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56409803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com