我想添加在客户端查看服务器异常的功能。
如果服务器出现异常=>我想在客户端显示一些将显示异常消息的MessageBox ..
我该怎么办?
答案 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");
}