随机"现有连接被远程主机强行关闭"

时间:2014-09-02 10:28:56

标签: c# .net wcf networking

调用WCF服务时,我们遇到了非常不寻常的行为。问题是有时它有效,然后有时我们得到以下错误(所有内部异常合并):

  

发出HTTP请求时发生错误。这可能是由于在HTTPS情况下未使用HTTP.SYS正确配置服务器证书。这也可能是由于客户端和服务器之间的安全绑定不匹配造成的。

     

基础连接已关闭:发送时发生意外错误。

     

无法将数据写入传输连接:远程主机强行关闭现有连接。

     

远程主机强行关闭现有连接

我们发现了以下情况:当以1秒的间隔重复几次时,服务呼叫正常工作。然后在等待2-3分钟后,异常发生并且它持续发生很长时间(我们没有确定)。在它开始工作之后,可以重复整个过程以再次获得异常。

只有当我们通过公司的防火墙连接时才会发生这种情况。如果我们直接连接到服务器,一切都按预期工作。

只有在调用函数 SaveBathroom 时才会发生一切,其他函数正常工作。我们怀疑这可能是因为邮件大小很大。

//Function on the server that fails *sometimes*
public ConfigurationSaveStatus SaveBathroom(BathroomConfiguration bathroom);

//Function that never fails
public UpdateInfo[] GetUpdates(string xml, string langauge, System.DateTime lastUpdateCheckDate);

//Interface:
public enum ConfigurationSaveStatus {...}

public class BathroomConfiguration
{
    public string BathroomNumber { get; set; }
    public DateTime ConfigurationDate { get; set; }
    public Version ClientVersion { get; set; }
    public bool ScenarioReady { get; set; }
    public bool ScenarioActivated { get; set; }
    public string LicenseXml { get; set; }
    public byte[] ConfigurationReportPdf { get; set; }
    public string Configuration { get; set; }
    public string eToolMac { get; set; }
}

public class UpdateInfo
{
    public int Id { get; set; }
    public string Version { get; set; }
    public string Category { get; set; }
    public string SubCategory { get; set; }
    public int Priority { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string FileLocation { get; set; }
    public long FileSize { get; set; }
    public DateTime ValidFrom { get; set; }
    public DateTime? ValidTo { get; set; }
}

//config
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IeAssistService" closeTimeout="00:01:00"
                        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                        bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                        maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                        allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                                                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="Transport">
                        <transport clientCredentialType="Basic"/>
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IeAssistService"
                contract="IeAssistService" name="BasicHttpBinding_IeAssistService" />
        </client>
    </system.serviceModel>
</configuration>

1 个答案:

答案 0 :(得分:0)

这个有点棘手。

首先我们发现防火墙阻止了请求。 Microsoft Forefront威胁管理网关使用证书登录回退到用户名/密码登录。

客户端使用的是用户名/密码凭据。似乎TMG上存在一个带有大消息和这种配置的错误,因此TMG自己关闭了连接。有时。并且在一段时间内拒绝了相同类型的新连接。

我们一旦禁用证书登录,一切都很好。