비 SSL (http) 환경에서 작동하는 코드를 먼저 보여 드리겠습니다. 이 코드는 사용자 정의 json 오류 처리기를 사용하고 발생하는 모든 오류는 클라이언트 자바 스크립트 (ajax)까지 버블 링됩니다.SSL (https)을 통한 WCF 객체 호스팅 Windows 서비스 - 사용자 정의 JSON 오류 처리가 작동하지 않습니다.
public class FaultingWebHttpBehavior : WebHttpBehavior
{
public FaultingWebHttpBehavior()
{
}
protected override void AddServerErrorHandlers(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Clear();
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(new ErrorHandler());
}
public class ErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
return true;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
// Build an object to return a json serialized exception
GeneralFault generalFault = new GeneralFault();
generalFault.BaseType = "Exception";
generalFault.Type = error.GetType().ToString();
generalFault.Message = error.Message;
// Create the fault object to return to the client
fault = Message.CreateMessage(version, "", generalFault, new DataContractJsonSerializer(typeof(GeneralFault)));
WebBodyFormatMessageProperty wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);
}
}
}
[DataContract]
public class GeneralFault
{
[DataMember]
public string BaseType;
[DataMember]
public string Type;
[DataMember]
public string Message;
}
AddServerErrorHandlers()() 메소드가 webServiceHost.Open하면, 자동으로 호출됩니다 호출됩니다 :
// Create webservice endpoint
WebHttpBinding binding = new WebHttpBinding();
ServiceEndpoint serviceEndPoint = new ServiceEndpoint(ContractDescription.GetContract(Type.GetType(svcHost.serviceContract + ", " + svcHost.assemblyName)), binding, new EndpointAddress(svcHost.hostUrl));
// Add exception handler
serviceEndPoint.Behaviors.Add(new FaultingWebHttpBehavior());
// Create host and add webservice endpoint
WebServiceHost webServiceHost = new WebServiceHost(svcHost.obj, new Uri(svcHost.hostUrl));
webServiceHost.Description.Endpoints.Add(serviceEndPoint);
webServiceHost.Open();
는 또한 당신을 보여거야 FaultingWebHttpBehavior 클래스는 모습. 이것은 사용자 정의 json 오류 처리기를 설정하고 수명은 양호합니다 .-)
SSL (https) 환경으로 전환하면 문제가 발생합니다. 이 SSL 엔드 포인트 코드
이제 // Create webservice endpoint
WebHttpBinding binding = new WebHttpBinding();
ServiceEndpoint serviceEndPoint = new ServiceEndpoint(ContractDescription.GetContract(Type.GetType(svcHost.serviceContract + ", " + svcHost.assemblyName)), binding, new EndpointAddress(svcHost.hostUrl));
// This exception handler code below (FaultingWebHttpBehavior) doesn't work with SSL communication for some reason, need to resarch...
// Add exception handler
serviceEndPoint.Behaviors.Add(new FaultingWebHttpBehavior());
//Add Https Endpoint
WebServiceHost webServiceHost = new WebServiceHost(svcHost.obj, new Uri(svcHost.hostUrl));
binding.Security.Mode = WebHttpSecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
webServiceHost.AddServiceEndpoint(svcHost.serviceContract, binding, string.Empty);
이, 서비스가 올바르게 시작하고, WCF는 객체가 클라이언트 자바 스크립트를 통해 잘와 통신 할 수 있습니다 호스팅 : 지금 SSL 당신에게 엔드 포인트 생성 코드를 보여 드리겠습니다. 그러나 사용자 지정 오류 처리기가 작동하지 않습니다. 그 이유는 webServiceHost.Open()이 실행될 때 AddServerErrorHandlers() 메서드가 호출되지 않기 때문입니다.
그럼,이 사진의 어떤 점이 잘못 됐는지 말해 줄 수 있습니까? 그리고 왜 AddServerErrorHandlers()가 자동으로 호출되지 않습니다. 예를 들어 비 SSL 엔드 포인트를 사용할 때처럼?
감사합니다.
글쎄, 나는 그것이 당신에게 좋은 발견이라고 말할 것이다. 나쁜 소식은 여전히 작동하지 않는다는 것입니다. 서비스는 정확히 동일하게 작동합니다. 그것은 correcty를 시작하지만 AddServerErrorHandlers()는 호출되지 않습니다. 따라서 오류는 절대로 처리되지 않습니다 ... – bpatrick100
Du Casini 또는 IIS를 사용하여 디버그합니까? Casini는 IIS와 동일하지 않다는 것을 기억하십시오 (예 : 멀티 스레드가 아닙니다) –
여기에 그림이 없습니다. webServiceHost.Open() 호출 도중 시작될 때 FaultingWebHttpBehavior()의 AddServerErrorHandlers() 메서드가 서비스를 시작할 때 자동으로 호출되어야합니다 (이는 비 SSL (http) 끝점에서 발생하는 문제이며 완벽하게 작동합니다.따라서 테스트하려면 AddServerErrorHandlers()에서 중단 점을 사용하여 서비스를 시작하기 만하면됩니다. HTTP 끝점에서 충돌하고 https 끝 점이 적중하지 않습니다. – bpatrick100