Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用WCF连接到服务器时捕获异常:_C#_Wpf_Wcf_Mvvm - Fatal编程技术网

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。通常,我会建议在用户的操作上构建一个新的代理,并仅将其用于该操作。这将避免处理意外超时、故障通道等。在创建新代理类时,不会有太多开销。