繁体   English   中英

如何在Wcf服务上引发异常并在客户端上捕获它?

[英]How to throw Exceptions on Wcf Service and catch it on client?

服务演示代码:

  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");
            }
        }  
    }

客户端代码演示:

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并保持服务正常运行。

我希望能很好地解释我的问题并提供必要的代码。

WCF使用Faults从服务器到客户端抛出错误。 您可以使用FaultException启动,然后根据需要创建自己的自定义错误。

因此,在您的示例中,您可以简单地执行以下操作。

throw new FaultException("Invalid login")

本文提供了有关如何完成WCF故障的更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM