HTTP입니다. SYS 강제로 연결을 끊습니다 자체 호스팅된 WCF 서비스는 HTTP 바인딩

이 문서는 Microsoft 기계 번역 소프트웨어를 이용하여 번역되었으며 Microsoft Community에 의한 Community Translation Framework(CTF) 기술 혹은 사람이 번역한 내용에 의하여 사후 편집될 수 있습니다. Microsoft는 Knowledge Base에 있는 모든 문서에 다양한 언어로 접근할 수 있도록 하기 위하여 기계 번역, 사람에 의한 번역 및 커뮤니티가 편집한 내용을 모두 제공합니다. 번역된 문서는 어휘, 구문 및/혹은 문법에 오류가 있을 수 있습니다. Microsoft는 번역 오류로 인한 부정확성, 오류 및/또는 손해와 이를 고객이 사용하는 데에 대하여 책임을 지지 않습니다.

이 문서의 영문 버전 보기:3137046
현상
Windows Server 2012 R2 실행 하 고 (예:basicHttpBinding) HTTP 기반 바인딩을 사용 하 여 서버의 Windows 통신 Foundation (WCF) 서비스 자체 호스팅 서버 일시적으로 내부 TCP 연결을 삭제 합니다. 이 문제가 발생 하면 HTTP에서 볼 수 있습니다. 일반적으로 C:\WINDOWS\System32\LogFiles\HTTPERR 폴더에 있는 시스템 로그입니다. 로그 파일이 Timer_MinBytesPerSecond이유를 나열 하는 항목이 있어야 합니다. Windows Server 2008 r 2에서이 문제가 발생 하지 않습니다.

로그 항목은 다음과 유사 합니다.
#Fields: 날짜 시간 c ip 포트 c s-ip 포트 s cs 버전 cs 메서드 cs uri sc-상태 s siteid 이유 s s-queuename
날짜시간 10.145.136.58 41079 10.171.70.136 HTTP/1.1 8888 게시 /MySelfHostedService/TestService1-Timer_MinBytesPerSecond-
날짜시간 10.145.136.58 41106 10.171.70.136 HTTP/1.1 8888 게시 /MySelfHostedService/TestService1-Timer_MinBytesPerSecond-
날짜시간 10.145.136.58 40995 10.171.70.136 HTTP/1.1 8888 게시 /MySelfHostedService/TestService1-Timer_MinBytesPerSecond-
날짜시간 10.145.136.58 41022 10.171.70.136 HTTP/1.1 8888 게시 /MySelfHostedService/TestService1-Timer_MinBytesPerSecond-
WCF 추적에서 서비스 다음 예제 에서처럼 System.Net.HttpListenerException수신 바이트 작업 하는 동안 실패:
<Exception>
<ExceptionType>System.ServiceModel.CommunicationException, System.ServiceModel, 버전 = 4.0.0.0, 문화권 중립, publickeytoken 등 = = b77a5c561934e089</ExceptionType>
<Message>존재 하지 않는 네트워크 연결에서 작업이 시도 되었습니다.</Message>
<StackTrace>
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()에서
System.ServiceModel.Channels.HttpOutput.Close()에서
System.ServiceModel.Channels.HttpRequestContext.OnReply (메시지 메시지, TimeSpan 시간 제한)에
System.ServiceModel.Channels.RequestContextBase.Reply (메시지 메시지, TimeSpan 시간 제한)에
System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, 문자열 statusDescription)에
System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex HttpRequestContext 컨텍스트)에서
</StackTrace>
<ExceptionString>System.ServiceModel.CommunicationException: 존재 하지 않는 네트워크에서 작업을 시도 했습니다 연결 System.Net.HttpListenerException---&gt;: 존재 하지 않는 네트워크 연결에서 작업이 시도 되었습니다
(부울 삭제) 하는 System.Net.HttpResponseStream.Dispose에서
System.IO.Stream.Close()에서
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()에서
---내부 예외 스택 추적---끝
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()에서
System.ServiceModel.Channels.HttpOutput.Close()에서
System.ServiceModel.Channels.HttpRequestContext.OnReply (메시지 메시지, TimeSpan 시간 제한)에
System.ServiceModel.Channels.RequestContextBase.Reply (메시지 메시지, TimeSpan 시간 제한)에
System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, 문자열 statusDescription)에
System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex HttpRequestContext 컨텍스트)에서</ExceptionString>
<InnerException>
<Exception>
<ExceptionType>System.Net.HttpListenerException, 시스템 버전 4.0.0.0, Culture = 중립, publickeytoken 등 = = b77a5c561934e089</ExceptionType>
<Message>존재 하지 않는 네트워크 연결에서 작업이 시도 되었습니다.</Message>
<StackTrace>
(부울 삭제) 하는 System.Net.HttpResponseStream.Dispose에서
System.IO.Stream.Close()에서
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()에서
</StackTrace>
<ExceptionString>(0x80004005)를 System.Net.HttpListenerException: 존재 하지 않는 네트워크 연결에서 작업을 시도 했습니다.
(부울 삭제) 하는 System.Net.HttpResponseStream.Dispose에서
System.IO.Stream.Close()에서
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()에서</ExceptionString>
<NativeErrorCode>CD 4</NativeErrorCode>
</Exception>
</InnerException>
</Exception>
원인
Windows Server 2012 r 2 부터는 커널 드라이버 (http.sys) HTTP 요청을 처리 하는Timer_MinBytesPerSecond속성을 처리 하는 방법을 측면에서 변경 되었습니다. 기본적으로 Http.sys 잠재적인 저속 연결 공격으로 초당 150 바이트 보다 작은 모든 속도 속도 고려 하 고 리소스를 해제 하는 TCP 연결을 삭제 합니다. Windows Server 2008 r 2에서 Windows Server 2012 R2에서 느린 연결 임계값 훨씬 더 제한적 이기 때문에이 문제가 발생 하지 않습니다.
해결 과정
이 기능을 해결 하려면 minSendBytesPerSecond0xFFFFFFFF 로 설정 (최대 32 비트 부호 없는 정수 값)을 십진수에서 4294967295입니다. 특정 값이 낮은 속도 속도 연결 기능을 비활성화합니다.

MinSendBytesPerSecond0xFFFFFFFF로 설정 하려면 다음 방법 중 하나를 사용 합니다.

방법 1: 구성 파일을 사용

 <system.net>    <settings>       <httpListener>           <timeouts minSendBytesPerSecond="4294967295" />       </httpListener>    </settings> </system.net>

방법 2: 프로그래밍 방식으로 설정

다음 예제와 같이 코드에서 명시적으로 속성 변경:

System.Net.HttpListenerTimeoutManager.MinSendBytesPerSecond = 4294967295

서비스의 코드를 변경 하지 않는 경우는 프로그래밍 옵션을 사용자 지정 serviceBehavior를 만들 수 있습니다. 즉, DLL을 삭제 하 고 다음 예제와 같이 구성을 변경 하 여 기존 서비스와 동작을 통합할 수 있습니다.
  1. Visual Studio 솔루션을 열고 하 고 새 클래스 라이브러리 프로젝트에 추가 합니다. 이름을 "BehaviorProject."
  2. "HttpListenerBehavior." 이라는 클래스 만들기
  3. 다음 소스 코드를 사용 하 여 업데이트:
    namespace BehaviorProject{    public class HttpListenerBehavior : BehaviorExtensionElement, IServiceBehavior    {        public override Type BehaviorType        {            get { return this.GetType(); }        }        protected override object CreateBehavior()        {            return new HttpListenerBehavior();        }        public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)        {            return;        }        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)        {                        UpdateSystemNetConfiguration();        }        private void UpdateSystemNetConfiguration()        {            ConfigurationProperty minSendBytesPerSecond;            minSendBytesPerSecond = new ConfigurationProperty("minSendBytesPerSecond",                typeof(long), (long)uint.MaxValue, null, null, ConfigurationPropertyOptions.None);            ConfigurationPropertyCollection properties;            HttpListenerTimeoutsElement timeOuts = new HttpListenerTimeoutsElement();            properties = GetMember(timeOuts, "properties") as ConfigurationPropertyCollection;            if (properties != null)            {                properties.Remove("minSendBytesPerSecond");                SetMember(timeOuts, "minSendBytesPerSecond", minSendBytesPerSecond);                properties.Add(minSendBytesPerSecond);            }        }        public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)        {            return;        }        public static object GetMember(object Source, string Field)        {            string[] fields = Field.Split('.');            object curr = Source;            BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;            bool succeeded = false;            foreach (string field in fields)            {                Type t = curr.GetType();                succeeded = false;                FieldInfo fInfo = t.GetField(field, bindingFlags);                if (fInfo != null)                {                    curr = fInfo.GetValue(curr);                    succeeded = true;                    continue;                }                PropertyInfo pInfo = t.GetProperty(field, bindingFlags);                if (pInfo != null)                {                    curr = pInfo.GetValue(curr, null);                    succeeded = true;                    continue;                }                throw new System.IndexOutOfRangeException();            }            if (succeeded) return curr;            throw new System.ArgumentNullException();        }        public static void SetMember(object Source, string Field, object Value)        {            string[] fields = Field.Split('.');            object curr = Source;            BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public;            bool succeeded = false;            int i = 0;            foreach (string field in fields)            {                i++;                Type t = curr.GetType();                succeeded = false;                FieldInfo fInfo = t.GetField(field, bindingFlags);                if (fInfo != null)                {                    if (i == fields.Length)                        fInfo.SetValue(curr, Value);                    curr = fInfo.GetValue(curr);                    succeeded = true;                    continue;                }                PropertyInfo pInfo = t.GetProperty(field, bindingFlags);                if (pInfo != null)                {                    if (i == fields.Length)                        fInfo.SetValue(curr, Value);                    curr = pInfo.GetValue(curr, null);                    succeeded = true;                    continue;                }                throw new System.IndexOutOfRangeException();            }            if (succeeded) return;            throw new System.ArgumentNullException();        }    }}

  4. 라이브러리 응용 프로그램을 빌드하십시오.
  5. 생성된 된 DLL을 응용 프로그램 폴더에 복사 합니다.
  6. 응용 프로그램 구성 파일을 찾아 해당 <system.serviceModel>태그와 다음과 같은 사용자 지정 동작 추가:</system.serviceModel>
    <extensions> <behaviorExtensions> <add name="httpListenerBehavior" type="BehaviorProject.HttpListenerBehavior, BehaviorProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> </behaviorExtensions></extensions><behaviors> <serviceBehaviors> <!-- if the serviceBehavior used by the service is named, add to the appropriate named behavior --> <behavior name="customBehavior"> <!-- The behavior is referenced by the following in line. Visual Studio will mark this line with a red underline because it is not in the config schema. It can be ignored. Notice that the other behaviors (like serviceMetadata) does not need to be added if they are not currently present --> <httpListenerBehavior /> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors></behaviors>
추가 정보
변경 내용이 적용 된 여부를 확인 하려면 다음 방법 중 하나를 사용 합니다.

방법 1

  1. ServiceHost를 열은 메모리 덤프 로그가 캡처하십시오.
  2. System.Net.HttpListenerTimeoutManager형식의 개체를 덤프 하 고minSendBytesPerSecond 속성을 읽습니다.
0:000 &gt;. /D 02694a64 DumpObj
이름: System.Net.HttpListenerTimeoutManager
MethodTable: 7308b070
EEClass: 72ec5238
크기: 20(0x14) 바이트
파일: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
필드:
MT 필드 오프셋 유형 VT Attr 값 이름
73092254 4001605 4... Net.HttpListener 0 인스턴스 026932f0 수신기
73c755d4 4001606 8 System.Int32 0 인스턴스 02694a78 시간 제한
73c7ef20 4001607 c System.UInt32 1 인스턴스 4294967295 minSendBytesPerSecond<>

MinSendBytesPerSecond 의 값은 4294967295 표시 됩니다.

방법 2
  1. 관리자 모드에서 cmd.exe를 열고 (serviceHost를 열) 한 후 명령 프롬프트에서 다음 명령을 실행 합니다.

    netsh http servicestate 보기를 표시 합니다. "세션" = &gt; %temp%\netshOutput.txt
  2. NetshOutput.txt 파일을 열고 다음 명령을 실행 합니다. 메모장에서 열립니다.

    %temp%\netshOutput.txt을 시작 합니다.
  3. 서비스 응용 프로그램 포트 번호 (예: 8888) 검색 하 고 사용자의 세션을 볼. 최소 전송 속도 (바이트/초) 4294967295 값으로 재정의 하는 확인 하는 단계입니다.
  4. 다음과 유사한 항목이 나타납니다.

    서버 세션 ID: FE00000320000021
    버전: 2.0
    상태: 활성
    속성:
    최대 대역폭: 4294967295
    시간 제한:
    엔터티 본문 시간 제한 (초): 120
    드레이닝 엔터티 본문 시간 제한 (초): 120
    요청 큐 시간 제한 (초): 120
    유휴 연결 시간 제한 (초): 120
    머리글 대기 제한 시간 (초): 120
    최소 전송 속도 (바이트/초): 150
    URL 그룹:
    URL 그룹 ID: FD00000340000001
    상태: 활성
    요청 큐 이름: 요청 큐 이름이 없습니다.
    속성:
    최대 대역폭: 상속
    최대 연결: 상속
    시간 제한:
    엔터티 본문 시간 제한 (초): 0
    드레이닝 엔터티 본문 시간 제한 (초): 0
    요청 큐 시간 제한 (초): 0
    유휴 연결 시간 제한 (초): 0
    머리글 대기 제한 시간 (초): 0
    최소 전송 속도 (바이트/초): 4294967295<>
    등록 된 Url 수: 1
    등록 된 Url:
    HTTP://+:8888/TESTSERVICE1/
자세한 내용은 해당 HttpListenerTimeoutManager.MinSendBytesPerSecond 속성 Microsoft Developer Network 웹 사이트에서 항목입니다.
참고 이것은 Microsoft 기술 지원 서비스 내에서 직접 작성한 “빠른 게시” 문서입니다. 여기에 포함된 정보는 발생한 문제에 대해 있는 그대로 제공됩니다. 이 문서는 즉시 참조할 수 있도록 빠르게 작성되어서 표기상의 오류가 포함되어 있을 수 있고 언제든지 예고 없이 수정될 수 있습니다. 기타 고려 사항은사용 약관을 참조하십시오.정보

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 3137046 - 마지막 검토: 03/25/2016 01:15:00 - 수정: 3.0

Windows Communication Foundation 4.5, Windows Communication Foundation 4

  • kbmt KB3137046 KbMtko
피드백