Windows 서비스에서 웹 서버에서 실행중인 WCF 서비스로의 WCF 호출을 사용하는 데 문제가 있습니다. 이 통화는 몇 주 동안 작동했지만 갑자기 작동을 멈 췄고 그 이후로 작동하지 않았습니다.
내가 얻는 예외는 다음과 같습니다.
일반 오류 발생 System.ServiceModel.CommunicationException : HTTP 요청을 만드는 동안 오류가 발생했습니다.
그리고 그것은 말한다
이는 HTTPS의 경우 서버 인증서가 HTTP.SYS로 올바르게 구성되지 않았기 때문일 수 있습니다. 이는 클라이언트와 서버 간의 보안 바인딩 불일치로 인해 발생할 수도 있습니다.
내가 양쪽에서 사용하는 보안은 어떤 종류의 암호화도없이 wsHttpBinding입니다. 또한 HTTPS가 아닌 HTTP를 사용하기 때문에 HTTPS에 대해 불평하는 이유를 모르겠습니다.
나머지 내부 예외 스택은 다음과 같습니다.
SystemNet.WebException : 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다. —> System.IO.IOException : 전송 연결에 데이터를 쓸 수 없습니다. 잘못된 인수가 제공되었습니다. —> System.Net.Sockets.SocketException : System.Net.Sockets.Socket.MultipleSend (BufferOffsetSize [] buffers, SocketFlags socketFlags)의 System.Net.Sockets.NetworkStream.MultipleWrite (BufferOffsetSize []에 잘못된 인수가 제공되었습니다. 버퍼)
또한이 문제가 발생하는 내 프로그램의 지점은 웹 서비스 호출의 “실행”줄에 있습니다. 즉, 웹 서비스를 호출하고 래핑 된 DataContract 개체를 전달하는 즉시 폭파.
이 서비스가 수행하는 모든 작업은 많은 양의 XML (클라이언트 측 호출에 .NET 개체로 전달됨)을 전달한 다음 일부 작업을 수행하는 것입니다. 아마도 약 100-200k의 XML이 전송되고 있습니다. 양쪽 끝의 데이터 크기에 대한 제한을 6 메가 이상으로 늘 렸지만 도움이되지 않는 것 같습니다.
어떤 아이디어?
이 문제에 대한 추가 정보 :
클라이언트 환경을 로컬로 복제 할 때 다음과 같이 변경하지 않으면 많은 양의 XML을 업로드 할 수 없습니다. 1. 서버에서 “maxRequestLength”를 100MB로 설정합니다 (보내는 것보다 훨씬 높음). 2. 켜기 클라이언트에서 dataContractSerializer 태그 아래의 maxItemsInObjectGraph 값을 “2147483646”으로 설정했습니다.
이러한 변경으로 로컬 설치가 성공적으로 업로드됩니다. 그러나 클라이언트의 서버 설치는 여전히 실패합니다. 흥미로운 점은 서버에서 maxRequestLength 값을 변경 한 후 테스트 설치에서 특히 maxItemsInObjectGraph 설정과 관련된 오류가 발생하기 시작했다는 것입니다. 클라이언트 서버에서는 여전히 원래 “HTTP.sys”오류가 발생합니다.
앞서 언급했듯이 우리는 SSL을 전혀 사용하지 않으며 동일한 방식으로 XML을 실행하고 업로드하는 2 개의 다른 웹 서비스 호출이 있습니다. 그러나 작동하지 않는 서비스 호출은 더 많은 데이터를 전송하기 때문에 크기 문제로 보입니다.
그러나 클라이언트가 가진 문제가 테스트 설치와 동일한 문제인 경우 클라이언트 오류 메시지가 ObjectGraph 오류와 관련이없는 이유를 알 수 없습니다.
클라이언트에서 가능한 모든 오류에 대해 일반적인 “유효하지 않은 매개 변수” “HTTP.sys”오류가 발생하는 것이 가능합니까 (즉, 실제로 objectGraph 오류도 발생하지만 표시되지 않습니까?)
답변
호스트 서버가 TLS V1.2를 사용하도록 업데이트되었고 표준 SSL을 사용하여 연결했기 때문에이 문제가 발생했습니다. 이것은 사이트의 펜 테스트의 일부로 만들어진 업데이트입니다. 우리는 코드 연결에서 문제를 보았지만 wsdl로가는 브라우저는 보지 못했습니다. 아래 코드가 해결되었습니다.
if (System.Net.ServicePointManager.SecurityProtocol == (SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls))
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
출처 : SSL 폴백을 비활성화하고 .NET에서 아웃 바운드 연결에 TLS 만 사용하려면 어떻게해야합니까? (푸들 완화)
답변
IIS 7에서 실행되는 서비스에서 동일한 문제가 발생하여 서비스가 여러 공급 업체 서버 (일부는 SSL이 아님)에 새 서버를 추가 할 때 (일부는 SSL이 아님) 연결됩니다 (이 새로운 공급 업체는 TLS 1.2 임). 몇 번의 요청 후 오류가 발생했습니다. 원래 서버 (SSL)로 만들어졌습니다.
이를 확인 System.Net.ServicePointManager.SecurityProtocol
하기 위해 각 공급 업체에 요청하기 전에 간단히 기록했습니다 .
낮고 서비스를 다시 시작한 후 (또는 응용 프로그램 풀을 다시 시작한 후) 보라. 출력을 얻을 수 Ssl3, Tls
있지만 원래 공급자 서버에 대한 몇 가지 요청 후에 이것이 변경되고 Ssl3
TLS 서비스에 대한 요청으로 오류가 발생했습니다.
수정하기 위해 user369142가 제안한 것을 간단히 수행했습니다. 새 서버에 대한 각 요청 전 :
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
더 이상 오류가 없습니다.
답변
이 문제는 진정한 HTTPS 바인딩과 “HTTP.SYS가 HTTPS 케이스에서 제대로 구성되지 않았기 때문에 서버 인증서가 제대로 구성되지 않았기 때문일 수 있습니다.”와 동일한 예외가 발생했습니다. 코드와 구성의 모든 것을 다시 확인한 후 오류 메시지가 내부 예외만큼 오해의 소지가없는 것처럼 보이므로 빠른 확인 후 포트 443이 (개발 서버에서) skype에 의해 연결되었음을 발견했습니다. 요청을 보류하는 항목 (Fiddler가 여기에서 도움이 될 수 있음)을 살펴보고 서비스 전면 (브라우저에서 .svc보기) 및 해당 메타 데이터에 도달 할 수 있는지 확인하는 것이 좋습니다.
행운을 빕니다.
답변
제 경우에는 SchUseStrongCrypto
.Net 을 사용하도록 설정해야했습니다. 이렇게하면 서버가 TLS 1.0, 1.1 또는 1.2를 사용하여 연결해야합니다. 없이SchUseStrongCrypto
사용 가능 연결이 내 원격 엔드 포인트에서 비활성화되었습니다 사용 SSL 3.0에 노력했다.
강력한 암호화를 사용하기위한 레지스트리 키 :
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
답변
우리에게이 오류는 서비스를 실행하는 개발자의 컴퓨터에 127.0.0.1에서만 포트 443을 바인딩하도록 IIS가 구성되어 있기 때문입니다.
IIS 관리자에서 웹 사이트를 마우스 오른쪽 단추로 클릭하고 바인딩 편집을 선택합니다. 포트 항목에 443
IP 주소가 있으면로 127.0.0.1
변경하십시오 *
.
답변
많은 검색과 영주의 이름을 헛되이 취한 후 마침내 얻었습니다. 내 wcf 서비스가 실행되는 서버에 TLS 1.2를 설치했습니다. 내 클라이언트는 올바르게 구성되었지만 .NET 4.5.1에서 빌드되었지만 wcf는 .NET 4.6.1에있었습니다. TLS 1.2를 사용하는 경우 클라이언트와 서버 모두 동일한 .NET 버전이어야합니다. 언젠가 누군가에게 도움이되기를 바랍니다.
답변
클라이언트 애플리케이션을 4.5 이상으로 변경하십시오. 4.5 인 경우 다음을 사용합니다. System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 / Tls1.1 / Tls1.0 필요에 따라 응용 프로그램을 4.6.1 이상으로 업그레이드 할 수 있습니다.