在silverlight客户端上显示服务器例外

时间:2011-06-30 10:15:03

标签: .net wcf

我想添加在客户端查看服务器异常的功能。

如果服务器出现异常=>我想在客户端显示一些将显示异常消息的MessageBox ..

我该怎么办?

3 个答案:

答案 0 :(得分:2)

首先,您需要启用WCF服务以返回详细的错误信息。出于安全原因,默认情况下这是关闭的(您不想在错误消息中告诉攻击者系统的所有详细信息......)

为此,您需要使用<ServiceDebug>行为创建新的或修改现有的服务行为:

<behaviors>
    <serviceBehaviors>
       <behavior name="ServiceWithDetailedErrors">
           <serviceDebug includeExceptionDetailInFaults="true" />
       </behavior>
    </serviceBehaviors>
</behaviors>

其次,您需要更改<service>标记以引用此新服务行为:

<service name="YourNamespace.YourServiceClassName"
         behaviorConfiguration="ServiceWithDetailedErrors">
   ......
</service>

第三:您需要调整您的SL解决方案,以查看您现在所遇到的错误的详细信息。

最后:虽然此设置在开发和测试中非常有用,但将这些错误详细信息关闭以进行生产 - 出于安全原因,请参见上文。

答案 1 :(得分:0)

除了Marc提到的内容之外,您还需要切换到HTTP客户端堆栈,以避免可怕的泛型&#34; Not Found&#34;错误。

bool registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);

答案 2 :(得分:0)

如果您将错误传递给客户,您可以使用错误合同:

将此属性添加到服务合同中:

    [OperationContract]
    [FaultContract(typeof(MyCustomException))]
    void MyServiceMethod();

创建“MyCustomException”的类,其中包含您希望传递给客户端的信息(在本例中为exception.ToString()的异常的完整详细信息)。

然后在服务方法的实现中添加一个try / catch代码:

 public void MyServiceMethod()
 {
      try
      {
         // Your code here
       }
      catch(Exception e)
      {
         MyCustomException exception= new MyCustomException(e.ToString());
                throw new FaultException<MyCustomException>(exception);
       }
 }

在客户端,您可以输入try / catch(FaultException e)并显示您喜欢的详细信息。

 try
        {
            // your call here
        }
        catch (FaultException<MyCustomException> faultException)
        {
            // general message displayed to user here
            MessageBox.Show((faultException.Detail as MyCustomException).Details);
        }
        catch (Exception)
        {
            // display generic message to the user here
            MessageBox.Show("There was a problem connecting to the server");
        }