我有一个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(完全符合供应商的期望)。我们的防火墙没有显示任何被阻止的内容,并且“连接重置”消息在其请求的前几秒钟之内。第三方可以从他们的浏览器访问WSDL,因此所有这些使我相信握手期间会出现故障。 SoapUI正在实现并且可以在Java上运行,因此,我们在这一点上确实很困惑。 Java调用C#WCF应用程序是否需要额外的东西?有没有办法捕获握手尝试?
答案 0 :(得分:1)
在双方很多聪明的人的帮助下,问题最终变成了服务器名称指示(SNI):
https://en.wikipedia.org/wiki/Server_Name_Indication
供应商的应用程序正在运行Java的旧版本,该版本不了解/不支持SNI,并且此时他们无法升级。
我们的服务器管理员在Windows Server上为供供应商调用的域专用IP,并为该特定域禁用了SNI。现在,我们可以毫无问题地接收供应商的Web服务器呼叫。