2016-06-02 20 views
8

'dan sonra istemciye geri döndü TransportWithMessageCredential güvenlik ile yapılandırılmış bir WCF servisim var. IAuthorizationPolicy, ServiceAuthenticationManager ve ServiceAuthorizationManager için her üç uygulama yerinde ve etkilidir. Bildiğim kadarıylaWCF Erişim Reddedilen istisna hiçbir zaman CheckAccessCore

serviceHost.Credentials.ServiceCertificate.SetCertificate("CN=localhost"); 
serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new CustomValidator(); 
serviceHost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = System.ServiceModel.Security.UserNamePasswordValidationMode.Custom; 

serviceHost.Authorization.PrincipalPermissionMode = PrincipalPermissionMode.Custom; 
serviceHost.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager(); 
serviceHost.Authentication.ServiceAuthenticationManager = new MyServiceAuthenticationManager(); 
serviceHost.Authorization.ExternalAuthorizationPolicies = 
    new System.Collections.ObjectModel.ReadOnlyCollection<System.IdentityModel.Policy.IAuthorizationPolicy>(
     new MyAuthorizationPolicy[] { new MyAuthorizationPolicy() }); 

, ServiceAuthorizationManager miras sınıfta, CheckAccessCore yöntemde, bir return false açıklamada engellendi bir Erişim gösterir. İstemci tarafının, hizmetin istemciye bir şey vermeyi durdurduğu ve hizmet ipinin askıya alındığı bir erişim reddedildi istisnası olduğunu bilmesini istemiyorum.

İstemci tarafında try catch her türlü denedim ve hatta işlem için bir FaultContract ekledim, ancak sorun direnir.

Tek gördüğüm, Tanı Araçları'nda iki hata olayıdır.

enter image description here

erişim engellendi hata kullanıcı hizmeti almak için benim uygulamalarından ne bilgilendirmek eksik?

Güncelleme

Ben RoutingService kullanıyorum ve şimdi gerçek nedeni RoutingService nasılsa istisna yiyor, fakat bu tam olarak nerede bilmiyorum ki tahmin söylemek dikkate değer özellikleri. Her olası yönteme adım atmış olsam da, onu bulamadım.

Güncelleme 2

Ben yerinde IErrorHandler var: bununla

public class ServiceErrorHandler : IErrorHandler 
    { 
     public bool HandleError(Exception error) 
     { 
      //You can log th message if you want.    
      return true; 
     } 

     public void ProvideFault(Exception error, MessageVersion version, ref Message msg) 
     { 
      if (error is FaultException) 
       return; 

      FaultException faultException = new FaultException(error.Message); 
      MessageFault messageFault = faultException.CreateMessageFault(); 
      msg = Message.CreateMessage(version, messageFault, faultException.Action); 
     } 
    } 

Ama olay çağıran istemci alışkanlık ayıklama olaylar görünecektir işlenmeyen istisna '' istisna ve aynı olsun'.

: Ben çağıran istemci başarısız olabilir

tek yolu bence IDispatchMessageInspector arasında BeforeSendReply yönteminde bir istisna atma gereğidir Ben FaultException yerine istemci tarafında bir CommunicationException olsun gitmek yol değildir

public void BeforeSendReply(ref Message reply, object correlationState) 
    {       
     if (reply != null && reply.IsFault) 
     { 
      var messageFault = MessageFault.CreateFault(reply, Int32.MaxValue); 
      throw new FaultException("Access was denied", messageFault.Code); 
     } 
    } 

WCF İzleme: Davandan bir SecurityAccessDeniedException yılında, burada, ancak bunun yerine bir İletişim İstisna bir FaultException beklememelisiniz enter image description here

+0

Eğer iade edilecek hata "Erişim Engellendi" bekliyoruz ne olduğunu tam olarak açıklayabilir misiniz? Ve belki de ilgili müşteri tarafı kodunun bir kısmını gönderebilir misiniz? Son bir düşünce: bir hata döndürürken asılı olan bir iplik, çok iş parçacıklı tuhaflığı öneriyor; istisnanın nasıl tetiklendiğine/işlendiğine dair fark edilmeyen bir çıkmaz veya yarış durumu olabilir mi? –

+0

[Bu StackOverflow gönderisini görmek de isteyebilirsiniz] (http://stackoverflow.com/questions/17738305/wcf-routing-service-dynamic-error-handling) –

+0

WCF izlemeyi açmayı denediniz mi? Bu, sunucu tarafında neler olduğu hakkında daha fazla bilgi verebilir. – MvdD

cevap

1

. Bu aşamada dile getirilen istisnaların, iletişim konusuyla ilgili olduğu gibi, iletişimde olduğu gibi, istisnalar olmasını da beklerdim.

+0

problem istisna değil, istisna yutulur. –

0

aşağıdaki gibi kod türünü değiştirmek deneyin:

<bindings> 
    <wsHttpBinding> 
     <binding name="NoSecurityBinding" > 
      <security mode="None"> 
       <transport clientCredentialType="None"/> 
       <message clientCredentialType="None"/> 
      </security> 
     </binding> 
     <binding name="DefaultBinding" /> 
    </wsHttpBinding> 
</bindings> 
+0

Transport + Message güvenliği ile TCP kullanıyorum. –

+0

Lütfen ile deneyin. –

İlgili konular