이 항목에서는 WCF 애플리케이션을 더 간단하게 작성할 수 있는 새로운 기능에 대해 설명합니다.
WCF의 대안으로 gRPC
gRPC는 WCF에 대한 인기 있는 대안인 최신 RPC 프레임워크입니다. gRPC는 HTTP/2를 기반으로 빌드되며 다음을 포함하여 WCF에 비해 다양한 이점을 제공합니다.
- 성능: gRPC는 특히 장기 실행 연결의 경우 WCF보다 훨씬 효율적입니다.
- 확장성: gRPC는 많은 수의 클라이언트 및 서버로 확장하도록 설계되었습니다.
- 보안: gRPC는 TLS 및 인증을 비롯한 다양한 보안 메커니즘을 지원합니다.
- 플랫폼 간: gRPC는 플랫폼 중립적이며 다양한 프로그래밍 언어와 함께 사용할 수 있습니다.
WCF 앱을 개발하거나 gRPC로 마이그레이션하는 방법에 대한 자세한 내용은 다음을 참조하세요.
간소화된 생성된 구성 파일
Visual Studio에서 서비스 참조를 추가하거나 SvcUtil.exe 도구를 사용하면 클라이언트 구성 파일이 생성됩니다. 이전 버전의 WCF에서 이러한 구성 파일은 해당 값이 기본값인 경우에도 모든 바인딩 속성의 값을 포함했습니다. WCF 4.5에서 생성된 구성 파일에는 기본값이 아닌 값으로 설정된 바인딩 속성만 포함됩니다.
다음은 WCF 3.0에서 생성된 구성 파일의 예입니다.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard" maxBufferSize="65536"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192"
maxArrayLength="16384" maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
다음은 WCF 4.5에서 생성된 동일한 구성 파일의 예입니다.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
Contract-First 개발
이제 WCF는 계약 우선 개발을 지원합니다. svcutil.exe 도구에는 WSDL 문서에서 서비스 및 데이터 계약을 생성할 수 있는 /serviceContract 스위치가 있습니다.
이식 가능한 하위 집합 프로젝트에서 서비스 참조 추가
이식 가능한 하위 집합 프로젝트를 사용하면 .NET 어셈블리 프로그래머가 여러 .NET 구현(데스크톱, Silverlight, Windows Phone 및 Xbox)을 지원하면서 단일 소스 트리를 유지하고 시스템을 빌드할 수 있습니다. 이식 가능한 하위 집합 프로젝트는 모든 .NET 구현에서 사용할 수 있는 어셈블리인 .NET 이식 가능한 라이브러리만 참조합니다. 개발자 환경은 다른 WCF 클라이언트 애플리케이션 내에서 서비스 참조를 추가하는 것과 동일합니다. 자세한 내용은 이식 가능한 하위 집합 프로젝트에서 서비스 참조 추가를 참조하세요.
ASP.NET 호환 모드 기본값 변경됨
WCF는 개발자에게 WCF 서비스를 작성할 때 ASP.NET HTTP 파이프라인의 기능에 대한 모든 권한을 부여하는 ASP.NET 호환성 모드를 제공합니다. 이 모드를 사용하려면 web.configaspNetCompatibilityEnabled 섹션에서 < 특성을 true로 설정해야 합니다. 또한 이 appDomain의 모든 서비스는 > 속성을 또는 RequirementsMode으로 설정해야 합니다AspNetCompatibilityRequirementsAttribute. 기본적으로 AspNetCompatibilityRequirementsAttribute은/는 이제 Allowed으로 설정되고, 기본 WCF 서비스 애플리케이션 템플릿은 aspNetCompatibilityEnabled 특성을 true으로 설정합니다. 자세한 내용은 Windows Communication Foundation 4.5 및 WCF Services 및 ASP.NET 새로운 기능 참조하세요.
스트리밍 개선 사항
비동기 스트리밍에 대한 새로운 지원이 WCF에 추가되었습니다. 비동기 스트리밍을 사용하도록 설정하려면 서비스 호스트에 DispatcherSynchronizationBehavior 엔드포인트 동작을 추가하고 해당 AsynchronousSendEnabled 속성을 .로
true설정합니다. 이렇게 하면 서비스가 느리게 읽는 여러 클라이언트에 스트리밍된 메시지를 보낼 때 확장성이 향상될 수 있습니다. WCF는 더 이상 클라이언트당 하나의 스레드를 차단하지 않으며 스레드를 확보하여 다른 클라이언트를 서비스합니다.서비스가 IIS 호스팅될 때 메시지 버퍼링과 관련된 제한 사항이 제거되었습니다. 이전 버전의 WCF에서 스트리밍 메시지 전송을 사용한 IIS 호스팅 서비스에 대한 메시지를 수신할 때 ASP.NET WCF로 보내기 전에 전체 메시지를 버퍼링합니다. 이로 인해 메모리가 크게 소비됩니다. 이 버퍼링은 .NET Framework 4.5에서 제거되었으며 이제 IIS 호스팅 WCF 서비스는 전체 메시지를 받기 전에 들어오는 스트림 처리를 시작할 수 있으므로 실제 스트리밍을 사용할 수 있습니다. 이렇게 하면 WCF가 메시지에 즉시 응답할 수 있으며 성능이 향상됩니다. 또한 들어오는 요청에 대한 ASP.NET 크기 제한에 대한
maxRequestLength값을 더 이상 지정할 필요가 없습니다. 이 속성이 설정되면 무시됩니다. 자세한 내용은maxRequestLengthhttpRuntime< 구성 요소를 참조>하세요. maxAllowedContentLength를 구성해야 합니다. 자세한 내용은 IIS 요청 제한을 참조하세요.
새 전송 기본값
다음 표에서는 변경된 설정과 추가 정보를 찾을 수 있는 위치에 대해 설명합니다.
| 재산 | 켜기 | 새 기본값 | 더 많은 정보 |
|---|---|---|---|
| 채널 초기화 시간 초과 | NetTcpBinding | 30초 | 이 속성은 TCP 연결이 .NET 프레이밍 프로토콜을 사용하여 자신을 인증하는 데 걸리는 시간을 결정합니다. 서버에 인증을 수행하기에 충분한 정보가 필요하기 전에 클라이언트가 일부 초기 데이터를 보내야 합니다. 이 시간 제한은 악의적인 인증되지 않은 클라이언트가 서버에 오랫동안 연결된 연결을 유지하지 않도록 의도적으로 ReceiveTimeout(10분)보다 작게 만들어집니다. 기본값은 30초입니다. 자세한 내용은 ChannelInitializationTimeout |
| 리스튼백로그 | NetTcpBinding | 16 * 프로세서 수 | 이 소켓 수준 속성은 큐에 대기할 "보류 중인 수락" 요청 수를 설명합니다. 수신 대기 백로그 큐가 채워지면 새 소켓 요청이 거부됩니다. 자세한 내용은 ListenBacklog |
| 최대 대기 수락 수 (maxPendingAccepts) | ConnectionOrientedTransportBindingElement (연결 지향 전송 바인딩 요소) SMSvcHost.exe |
2 * 전송 프로세서 수 4 * SMSvcHost.exe 프로세서 수 |
이 속성은 서버가 수신기에서 대기할 수 있는 채널 수를 제한합니다. MaxPendingAccepts가 너무 낮으면 대기 중인 모든 채널이 연결을 서비스하기 시작했지만 새 채널이 수신 대기를 시작하지 않은 약간의 시간 간격이 있습니다. 이 간격 동안 연결이 도착할 수 있으며 서버에서 대기 중인 항목이 없으므로 실패합니다. 이 속성은 속성을 더 큰 숫자로 설정 MaxPendingConnections 하여 구성할 수 있습니다. 자세한 내용은 MaxPendingAccepts 및 Net.TCP 포트 공유 서비스 구성을 참조하세요. |
| 최대 대기 연결 | ConnectionOrientedTransportBindingElement (연결 지향 전송 바인딩 요소) | 12 * 프로세서 수 | 이 속성은 전송에 의해 수락되었으나 ServiceModel Dispatcher에서 아직 처리되지 않은 연결의 수를 제어합니다. 이 값을 설정하려면 바인딩에 MaxConnections를 사용하거나 바인딩 요소에 maxOutboundConnectionsPerEndpoint를 사용하십시오. 자세한 내용은 MaxPendingConnections |
| receiveTimeout | SMSvcHost.exe | 30초 | 이 속성은 TCP 프레이밍 데이터를 읽고 기본 연결에서 연결 디스패치를 수행하기 위한 시간 제한을 지정합니다. 이는 들어오는 연결에서 프리앰블 데이터를 읽기 위해 SMSvcHost.exe 서비스가 계속 사용되는 시간에 한도를 두기 위해 존재합니다. 자세한 내용은 Net.TCP 포트 공유 서비스 구성을 참조하세요. |
비고
이러한 새 기본값은 .NET Framework 4.5를 사용하여 컴퓨터에 WCF 서비스를 배포하는 경우에만 사용됩니다. .NET Framework 4.0을 사용하여 컴퓨터에 동일한 서비스를 배포하는 경우 .NET Framework 4.0 기본값이 사용됩니다. 이러한 경우 이러한 설정을 명시적으로 구성하는 것이 좋습니다.
XmlDictionaryReaderQuotas
XmlDictionaryReaderQuotas 에는 메시지를 만드는 동안 인코더가 사용하는 메모리 양을 제한하는 XML 사전 판독기의 구성 가능한 할당량 값이 포함되어 있습니다. 이러한 할당량은 구성할 수 있지만 개발자가 명시적으로 설정해야 할 가능성을 줄이기 위해 기본값이 변경되었습니다.
MaxReceivedMessageSize 할당량이 변경되지 않았으므로 메모리 사용량을 제한하여 복잡성 XmlDictionaryReaderQuotas을 처리할 필요가 없도록 할 수 있습니다. 다음 표에서는 할당량, 새 기본값 및 각 할당량의 용도에 대한 간략한 설명을 보여 줍니다.
| 할당량 이름 | 기본값 | 설명 |
|---|---|---|
| MaxArrayLength | Int32.MaxValue | 허용되는 최대 배열 길이를 가져오고 설정합니다. 이 할당량은 바이트 배열을 포함하여 XML 판독기에서 반환하는 기본 형식 배열의 최대 크기를 제한합니다. 이 할당량은 XML 판독기 자체가 아니라 판독기를 사용하는 구성 요소에서 메모리 사용을 제한하지 않습니다. 예를 들어 보호된 DataContractSerializer판독기를 사용하는 경우 MaxArrayLength 이 할당량보다 큰 바이트 배열을 역직렬화하지 않습니다. |
| MaxBytesPerRead | Int32.MaxValue | 각 읽기에 대해 반환되는 최대 허용 바이트를 가져오고 설정합니다. 이 할당량은 요소 시작 태그 및 해당 특성을 읽을 때 단일 읽기 작업에서 읽는 바이트 수를 제한합니다. (스트리밍되지 않은 경우 요소 이름 자체는 할당량에 대해 계산되지 않습니다.) XML 특성이 너무 많으면 특성 이름이 고유성을 확인해야 하므로 처리 시간이 너무 많이 소요될 수 있습니다. MaxBytesPerRead 는 이 위협을 완화합니다. |
| MaxDepth | 128개 노드 깊이 | 이 할당량은 XML 요소의 최대 중첩 깊이를 제한합니다. MaxDepth 와 MaxBytesPerRead상호 작용: 판독기는 항상 현재 요소 및 모든 상위 항목에 대한 메모리에 데이터를 유지하므로 판독기의 최대 메모리 사용량은 이러한 두 설정의 곱에 비례합니다. 깊이 중첩된 개체 그래프를 역직렬화하는 과정에서, 역직렬 변환기는 전체 스택에 액세스하고 복구할 수 없는 StackOverflowException를 발생시켜야 합니다. XML 중첩과 개체 중첩 간에는 둘 다 DataContractSerializerXmlSerializer에 대한 직접적인 상관 관계가 있습니다. MaxDepth 는 이 위협을 완화하는 데 사용됩니다. |
| MaxNameTableCharCount | Int32.MaxValue | 이 할당량은 이름 지정에 허용되는 최대 문자 수를 제한합니다. 이름 파일에는 XML 문서를 처리할 때 발생하는 특정 문자열(예: 네임스페이스 및 접두사)이 포함됩니다. 이러한 문자열은 메모리에 버퍼링되므로 스트리밍이 예상될 때 과도한 버퍼링을 방지하기 위해 이 할당량이 사용됩니다. |
| MaxStringContentLength | Int32.MaxValue | 이 할당량은 XML 판독기에서 반환하는 최대 문자열 크기를 제한합니다. 이 할당량은 XML 판독기 자체가 아니라 판독기를 사용하는 구성 요소에서 메모리 사용을 제한하지 않습니다. 예를 들어 보호된 DataContractSerializer판독기를 사용하는 경우 MaxStringContentLength 이 할당량보다 큰 문자열을 역직렬화하지 않습니다. |
중요합니다
데이터 보안에 대한 자세한 내용은 데이터에 대한 보안 고려 사항 에서 "XML을 안전하게 사용"을 참조하세요.
비고
이러한 새 기본값은 .NET Framework 4.5를 사용하여 컴퓨터에 WCF 서비스를 배포하는 경우에만 사용됩니다. .NET Framework 4.0을 사용하여 컴퓨터에 동일한 서비스를 배포하는 경우 .NET Framework 4.0 기본값이 사용됩니다. 이러한 경우 이러한 설정을 명시적으로 구성하는 것이 좋습니다.
WCF 구성 유효성 검사
Visual Studio 내에서 빌드 프로세스의 일부로 이제 WCF 구성 파일의 유효성이 검사됩니다. 유효성 검사가 실패하면 유효성 검사 오류 또는 경고 목록이 Visual Studio에 표시됩니다.
XML 편집기 도구 설명
신규 및 기존 WCF 서비스 개발자가 서비스를 구성할 수 있도록 Visual Studio XML 편집기는 이제 모든 구성 요소 및 서비스 구성 파일의 일부인 속성에 대한 도구 설명을 제공합니다.
BasicHttpBinding 개선 사항
단일 WCF 엔드포인트가 다른 인증 모드에 응답할 수 있도록 합니다.
IIS에서 WCF 서비스의 보안 설정을 제어할 수 있도록 설정