2010-06-09 3 views
0

비 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 엔드 포인트를 사용할 때처럼?

감사합니다.

답변

0

나는 다음 MSDN의 문서 전송 값이 하여 WebHttpBinding이라는 (WebHttpSecurityMode을)를 지정하면

, 서비스 엔드 포인트에 대한 효과적인해진다 전송 속성에 의해 제공되는 설정을 참조합니다. WebHttpSecurityMode 값은 WebHttpBinding 생성자에서 이 명시 적 매개 변수로 사용되며 바인딩 인스턴스가 생성 된 후 값을 다시 설정할 수 없다는 경우에만 설정할 수 있습니다.

참조 : http://msdn.microsoft.com/en-us/library/bb348328.aspx

그래서 당신은 내가 이전이 사용 된 적이없는 그

WebHttpBinding binding = new WebHttpBinding(WebHttpSecurityMode.Transport); 

처럼 .ctor()로이 값

binding.Security.Mode = WebHttpSecurityMode.Transport; 

을 통과해야 항상 내 바인딩을 web.config 파일에 선언하지만 MSDN에 따르면이 작업을 수행해야합니다.

+0

글쎄, 나는 그것이 당신에게 좋은 발견이라고 말할 것이다. 나쁜 소식은 여전히 ​​작동하지 않는다는 것입니다. 서비스는 정확히 동일하게 작동합니다. 그것은 correcty를 시작하지만 AddServerErrorHandlers()는 호출되지 않습니다. 따라서 오류는 절대로 처리되지 않습니다 ... – bpatrick100

+0

Du Casini 또는 IIS를 사용하여 디버그합니까? Casini는 IIS와 동일하지 않다는 것을 기억하십시오 (예 : 멀티 스레드가 아닙니다) –

+0

여기에 그림이 없습니다. webServiceHost.Open() 호출 도중 시작될 때 FaultingWebHttpBehavior()의 AddServerErrorHandlers() 메서드가 서비스를 시작할 때 자동으로 호출되어야합니다 (이는 비 SSL (http) 끝점에서 발생하는 문제이며 완벽하게 작동합니다.따라서 테스트하려면 AddServerErrorHandlers()에서 중단 점을 사용하여 서비스를 시작하기 만하면됩니다. HTTP 끝점에서 충돌하고 https 끝 점이 적중하지 않습니다. – bpatrick100

관련 문제