2017-01-21 2 views
2

Service Demo Код: КодКак бросить исключения на службу Wcf и поймать его на клиенте?

public class Login : UserNamePasswordValidator 
    { 
     public override void Validate(string userName, string password) 
     { 
      if (new ProjectContext().Users.Count(x => x.Username == userName && x.Password == password) == 0) 
      { 
       throw new FaultException("Invalid login"); 
      } 
     } 
    } 

Client Demo:

internal bool LoginOnWcf(string address, string password) 
     { 
      try 
      { 
       service.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None; 
       service.ClientCredentials.UserName.UserName = address; 
       service.ClientCredentials.UserName.Password = password; 
       user = service.GetUserById(address); 
       return true; 
      } 
      catch (FaultException ex) 
      { 
       MessageBox.Show(ex.Message); 
       return false; 
      } 
     } 

Web.config Демо:

<behaviors> 
     <serviceBehaviors> 
     <behavior name="defaultProfile"> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceCredentials> 
      <clientCertificate> 
       <authentication certificateValidationMode="None" /> 
      </clientCertificate> 
      <serviceCertificate findValue="App1" storeLocation="CurrentUser" 
       storeName="My" x509FindType="FindBySubjectName" /> 
      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="App1.App_Code.Authentication.Login, App_Code/Authentication"/> 
      </serviceCredentials> 
     </behavior> 
     <behavior> 
      <!-- To avoid disclosing metadata information, set the values below to false before deployment --> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
</behaviors> 

Когда я бросить FaultException, то сервис аварий , Я хотел бы иметь возможность поймать FaultException на клиенте и поддерживать работу службы.

Надеюсь, что я хорошо объяснил свою проблему и предоставил нужный код.

ответ

5

WCF использует ошибки, чтобы перебрасывать ошибки с сервера на клиент. Вы можете использовать FaultException для запуска, а затем при необходимости создать свои собственные ошибки.

Итак, в вашем примере вы можете просто сделать следующее.

throw new FaultException("Invalid login") 

Это artcile обеспечивает гораздо более подробную информацию о том, как выполнить ошибки с WCF.

+0

Не могли бы вы проверить мои вопросы? На самом деле, я действительно не могу поймать «Исключение» на клиенте. – Elkin

+1

1. Вы уверены, что это ваш ответ на ошибку, которая вызывает проблему, а не какое-то другое исключение? Возможно, вам стоит рассмотреть возможность обертывания всего метода в попытке поймать и сбросить с него ошибку. 2. Вы полностью отредактировали вопрос, который делает мой ответ более недействительным. Ваш первоначальный вопрос показал отсутствие понимания недостатков, на которые я отвечал. Если у вас возникла новая проблема с ошибками, вы действительно должны были задать отдельный вопрос. –

+0

Мне очень жаль. Проблема заключалась в том, что был активирован вариант «перерыв, когда этот тип исключения был пользователь-необработанным». Возможно, вы захотите улучшить свой ответ на этом [картинке] (https://www.google.pt/search?q=break+when+this+exception+type+is+user-unhandled&espv=2&biw=1600&bih=794&source= lnms & tbm = isch & sa = X & ved = 0ahUKEwjJ0YvludnRAhVIwxQKHRW1BYQQ_AUIBigB # imgrc = lB-bsjrDrJqY9M% 3A) и этот [вопрос] (http://stackoverflow.com/questions/16970642/visual-studio-not-breaking-on-user-unhandled-exceptions) – Elkin

Смежные вопросы