SoapUI正常运行时,调用WCF的Java应用程序返回“连接重置”

时间:2019-06-01 19:28:48

标签: java c# asp.net web-services wcf

我有一个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应用程序是否需要额外的东西?有没有办法捕获握手尝试?

1 个答案:

答案 0 :(得分:1)

在双方很多聪明的人的帮助下,问题最终变成了服务器名称指示(SNI):

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

供应商的应用程序正在运行Java的旧版本,该版本不了解/不支持SNI,并且此时他们无法升级。

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