C# 无法使用WCF连接到服务器时捕获异常:
我的客户机应用程序中有一个C# 无法使用WCF连接到服务器时捕获异常:,c#,wpf,wcf,mvvm,C#,Wpf,Wcf,Mvvm,我的客户机应用程序中有一个Connection类,它将连接到WCF服务器 如果服务器未启动,或者客户端无法连接到服务器,则应捕获异常并在标签上显示错误消息 我第一次创建连接类的实例是在我的LoginViewModel类中: sta = Connection.Instance.HttpProxy.Login(LoginID, LoginPassword); public sealed class Connection { private readonly string _address
Connection
类,它将连接到WCF服务器
如果服务器未启动,或者客户端无法连接到服务器,则应捕获异常并在标签上显示错误消息
我第一次创建连接
类的实例是在我的LoginViewModel
类中:
sta = Connection.Instance.HttpProxy.Login(LoginID, LoginPassword);
public sealed class Connection {
private readonly string _address = ConfigurationManager.AppSettings["ConnectionAddress"];
private static Connection _instance;
private static object _padLock = new Object();
private static ChannelFactory<IPoS> httpFactory;
private static IPoS _httpProxy; //Singleton
public IPoS HttpProxy { get { return _httpProxy; } }
public static Connection Instance {
get {
if (_instance == null) {
lock (_padLock) {
if (_instance == null) {
_instance = new Connection();
}
}
}
return _instance;
}
}
private Connection() {
try {
httpFactory = new ChannelFactory<IPoS>(
new BasicHttpBinding(),
new EndpointAddress(_address));
_httpProxy = httpFactory.CreateChannel();
}
catch (Exception ex) {
BaseViewModel.SetErrorMessage("Error: " + ex, this);
}
}
}
这就是引发第一个异常的地方。但是,如果添加try/catch块,则不会捕获异常,而是引发XamlParseException
。连接
类的构造函数中的try/catch块也将不起作用。我该怎么处理
连接
类:
sta = Connection.Instance.HttpProxy.Login(LoginID, LoginPassword);
public sealed class Connection {
private readonly string _address = ConfigurationManager.AppSettings["ConnectionAddress"];
private static Connection _instance;
private static object _padLock = new Object();
private static ChannelFactory<IPoS> httpFactory;
private static IPoS _httpProxy; //Singleton
public IPoS HttpProxy { get { return _httpProxy; } }
public static Connection Instance {
get {
if (_instance == null) {
lock (_padLock) {
if (_instance == null) {
_instance = new Connection();
}
}
}
return _instance;
}
}
private Connection() {
try {
httpFactory = new ChannelFactory<IPoS>(
new BasicHttpBinding(),
new EndpointAddress(_address));
_httpProxy = httpFactory.CreateChannel();
}
catch (Exception ex) {
BaseViewModel.SetErrorMessage("Error: " + ex, this);
}
}
}
公共密封类连接{
私有只读字符串_address=ConfigurationManager.AppSettings[“ConnectionAddress”];
私有静态连接_实例;
私有静态对象_挂锁=新对象();
私有静态通道工厂httpFactory;
私有静态IPoS\u httpProxy;//单例
公共IPoS HttpProxy{get{return}HttpProxy;}
公共静态连接实例{
得到{
if(_instance==null){
锁(挂锁){
if(_instance==null){
_实例=新连接();
}
}
}
返回_实例;
}
}
专用连接(){
试一试{
httpFactory=新的ChannelFactory(
新的BasicHttpBinding(),
新端点地址(_地址));
_httpProxy=httpFactory.CreateChannel();
}
捕获(例外情况除外){
BaseViewModel.SetErrorMessage(“错误:”+ex,this);
}
}
}
登录方法中会引发异常,因为这是客户端第一次尝试连接到服务器。您可以将try-catch放在此方法周围,而不是初始化。除了您应该考虑正确处理连接类之外,您的连接还取决于一次性对象。当某些东西不能正常工作时,必须调用dispose方法。我不认为使用Singlton连接可以处理所有的复杂性,如果您使用多线程访问它,则错误处理是正确的。如果在singelton的情况下出现问题,没有任何方法可以恢复您的频道。我明白了。实际上,我刚刚开始学习WCF。关于如何正确管理和连接到WCF服务器,您有什么我可以阅读的链接吗?至少您必须在HttpProxy类周围放置using。这将正确地处理dispose。通常,我会建议在用户的操作上构建一个新的代理,并仅将其用于该操作。这将避免处理意外超时、故障通道等。在创建新代理类时,不会有太多开销。