'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.
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 olabilirtek 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
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? –
[Bu StackOverflow gönderisini görmek de isteyebilirsiniz] (http://stackoverflow.com/questions/17738305/wcf-routing-service-dynamic-error-handling) –
WCF izlemeyi açmayı denediniz mi? Bu, sunucu tarafında neler olduğu hakkında daha fazla bilgi verebilir. – MvdD