WCF问题集锦:基础连接已经关闭 接收时发生错误

今天,进行单元测试时,当执行到第二个测试类时——之前从来没有错误的测试居然报了:基础连接已经关闭 接收时发生错误。想想今天唯一改动的是在测试代码中加了下列两个执行体:

[TestFixtureSetUp]
public void Set()
{
    CommonFuns.SetTime();
}

[TestFixtureTearDown]
public void Restore()
{
    CommonFuns.RestoreTime();
}

其中,Set用来设置系统当前时间为制定值,Restore用来恢复系统时间。

然后,手动一个一个测试类执行过来,都是好的。为了确认问题的确是上述代码执行造成的,把上面代码注销后再次整体执行,没有报错;再次加上代码,整体执行,报错,重复上面两个,都是同一现象。确定问题原因是这段系统时间调整造成的。

想到手动执行就没有问题,猜测可能是因为系统执行过程中,从一个上一个类的恢复时间到下一个类的调整时间,然后又马上调用实际的测试代码,造成服务端(开发环境测试代码与服务端在同一电脑上)代码执行时系统时间错乱,从而造成超时等时间原因,最后关闭连接。因此,决定模拟手动操作,在调整和恢复时间后,加上1秒的延时再执行具体的测试方法。经过测试,问题解决。

系统时间调整代码如下:

using System.Runtime.InteropServices;

namespace VME.UnitTest.Service
{
    public class SystemTimer
    {
        //imports SetLocalTime function from kernel32.dll
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern int SetLocalTime(ref SystemTime lpSystemTime);

        //struct for date/time apis
        public struct SystemTime
        {
            public short wYear;
            public short wMonth;
            public short wDayOfWeek;
            public short wDay;
            public short wHour;
            public short wMinute;
            public short wSecond;
            public short wMilliseconds;
        }
    }
}
public static void SetTime()
{
    SetTime(0);
}

public static void RestoreTime()
{
    RestoreTime(0);
}

/// <summary>
/// 将时间从15点开始向后拨5小时
/// </summary>
public static void SetTime(int day)
{
    _diffHours = 0;

    if (DateTime.Now.Hour > 15)
    {
        _diffHours = 5;

        // And then set up a structure with the required properties and call the api from code:
        SystemTimer.SystemTime systNew = new SystemTimer.SystemTime();

        // 设置属性
        systNew.wDay = Convert.ToInt16(DateTime.Now.AddDays(day).Day);
        systNew.wMonth = Convert.ToInt16(DateTime.Now.Month);
        systNew.wYear = Convert.ToInt16(DateTime.Now.Year);
        systNew.wHour = Convert.ToInt16(DateTime.Now.Hour - _diffHours);
        systNew.wMinute = Convert.ToInt16(DateTime.Now.Minute);
        systNew.wSecond = Convert.ToInt16(DateTime.Now.Second);

        // 调用API,更新系统时间
        SystemTimer.SetLocalTime(ref systNew);

        Thread.Sleep(1000);
    }
}

/// <summary>
/// 将时间拨回
/// </summary>
public static void RestoreTime(int day)
{
    if (_diffHours > 0)
    {
        // And then set up a structure with the required properties and call the api from code:
        SystemTimer.SystemTime systNew = new SystemTimer.SystemTime();

        // 设置属性
        systNew.wDay = Convert.ToInt16(DateTime.Now.AddDays(day).Day);
        systNew.wMonth = Convert.ToInt16(DateTime.Now.Month);
        systNew.wYear = Convert.ToInt16(DateTime.Now.Year);
        systNew.wHour = Convert.ToInt16(DateTime.Now.Hour + _diffHours);
        systNew.wMinute = Convert.ToInt16(DateTime.Now.Minute);
        systNew.wSecond = Convert.ToInt16(DateTime.Now.Second);

        // 调用API,更新系统时间
        SystemTimer.SetLocalTime(ref systNew);

        _diffHours = 0;

        Thread.Sleep(1000);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-14 18:41:15

WCF问题集锦:基础连接已经关闭 接收时发生错误的相关文章

WCF 获取数据对象时,报“基础连接已经关闭: 接收时发生错误”

今天,在使用WCF返回一个对象时,遇到一个错误:基础连接已经关闭: 接收时发生错误.经过大半天的排查,原来是一个不起眼的东西在搞鬼: this.Configuration.ProxyCreationEnabled = true; 就是上面的代码中的 true 导致了程序报错,之后把 true 改成了 false 问题就解决了. 微软的官方对ProxyCreationEnabled的解释中这样阐述:即使使用此旗標來啟用 Proxy 建立,也只會針對符合進行 Proxy 處理需求的實體類型來建立 P

HttpWebRequest 基础连接已经关闭: 接收时发生错误

HttpWebRequest request = null; Stream webStream = null; HttpWebResponse response = null; StreamReader reader = null; string responseString = ""; try { byte[] bf = Encoding.UTF8.GetBytes(postString); request = WebRequest.Create(url) as HttpWebReq

C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误。

本人今天遇到的错误,C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误. 测试了很久,才发现,是安全协议问题,把安全协议加上就可以了 请求的地址安全协议可能也不一样, ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls

【已解决】Https请求——基础连接已经关闭 发送时发生错误

本人在做商用项目的推送消息功能时,借助第三方推送服务.这里避免有打广告的嫌疑,就不报名字了.由于是通过调用API接口,所以Post方法是自己写的,但是在开发环境是可以正常推送的,但是一上线就出各种问题.楼主猜测可能是开发环境测试时,推送的消息比较少,而线上推送消息很多,从而导致和连接数相关的错误.下文很有帮助,记录于此. 报的错误为:1. "基础连接已经关闭: 发送时发生错误"; 2016年10月25日18:56:53更新后来本篇的所有方法都尝试了,发现最后也没解决问题.最后问题终于解

C# .Net FrameWork3.5中异步HTTP请求时,由于安全协议的问题System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)方法抛出“基础连接已经关闭: 发送时发生错误”的解决办法

现象描述: C# .Net FrameWork3.5中异步HTTP请求时,由于安全协议的问题System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)方法抛出“基础连接已经关闭: 发送时发生错误”. 原因分析: 大多数情况下是由于客户端所设置的HTTP访问请求的安全协议不符合服务器端的安全协议要求.比如,NASA提供瓦片服务的http://worldwind25.arc.nasa.gov/wms?service=WMS&v

分析案例:界面提示“基础链接已经关闭:接收时发生错误”----本质为StackOverflow

问题描述: 一个业务复杂.执行时间很长的功能,经常报出“基础链接已经关闭:接收时发生错误”,很是蹊跷... 问题分析: 首先,查阅应用服务器的系统日志,发现问题发生时总是会伴随着w3wp进程崩溃的错误,很有问题呀... 错误存储段 ,类型 0 事件名称: APPCRASH 响应: 不可用 Cab Id: 0 问题签名: P1: w3wp.exe P2: 7.5.7601.17514 P3: 4ce7afa2 P4: oracommon11.dll P5: 11.2.0.3 P6: 4eb215c

WCF 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接。

详细错误信息: System.ServiceModel.CommunicationException: 接收对 http://localhost:48655/XXXXXX.svc 的 HTTP 响应时发生错误.这可能是由于服务终结点绑定未使用 HTTP 协           议造成的.这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致.有关详细信息,请参见服务器日志. System.Net.WebException: 基础连接已经关闭: 接收时发生错误. System.I

WCF 接收我服务的 HTTP 响应时发生错误

错误内容: System.ServiceModel.CommunicationException: 接收对 https://xx.com/xx.svc的 HTTP 响应时发生错误.这可能是由于服务终结点绑定未使用 HTTP 协议造成的.这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致.有关详细信息,请参见服务器日志. ---> System.Net.WebException: 基础连接已经关闭: 接收时发生错误. ---> System.IO.IOException:

接收对 http://192.168.1.18:8001/ObtainData/Service 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。

[2015/8/5 19:28:49]错误信息:接收对 http://192.168.1.18:8001/ObtainData/Service 的 HTTP 响应时发生错误.这可能是由于服务终结点绑定未使用 HTTP 协议造成的.这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致.有关详细信息,请参见服务器日志.异常类型:System.ServiceModel.CommunicationException程序集:mscorlib方法:Void HandleReturnMes