VS2010用户控制& WCF

时间:2011-10-19 15:37:50

标签: c# wcf user-controls

我们正在使用c#中的usercontrol来为tabm中的功能提供单独的类,它们运行良好。

当usercontrol使用任何Web服务的服务引用时,就会出现问题。 第一次拖动窗体上的控件工作。第二次,设计师将显示错误:

Could not find default endpoint element that references contract 'testSR.WebService' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element. 

app.config包含正确的端点,只要调用代码在表单内部就可以工作,只要我们将代码移动到usercontrol,我们就会遇到这些问题。

我甚至尝试将用户控件放在正确引用它的解决方案中的另一个项目中,并将端点/绑定配置从DLL的app.config复制到EXE app.config - 然后问题再次出现..

似乎用户控件无法引用webservices,但应该有一个解决方案!?

编辑:从我的测试中看来,用户控件现在似乎可以使用服务引用,但VisualStudio Designer只能在第一次工作,之后程序仍然有效,但设计师会显示错误,当我忽略它时,设计器从表单中删除用户控件。只要我不触摸包含的表单,用户控件就可以编辑并正常工作......

2 个答案:

答案 0 :(得分:1)

我假设您正在使用winforms。在UI和WCF之间有明确的分离,并通过使用户控件不直接调用wcf但调用为您调用服务层的中间类库来避免此问题和其他问题。通过这种方式,WCF将被这样的类库调用,并且您的UI将被隔离。

实际上正在考虑您正在描述的这个问题,您是否还需要在设计时连接WCF?如果是这样,你可以通过检查在设计时运行是否可以避免它,在这种情况下什么也不做。无论如何,删除依赖关系并让UI独立于服务引用是一个好主意。

答案 1 :(得分:1)

仅晚了四年,但我实际上在用户控件中实例化服务时找到了修复WCF的问题。

  1. 正如@DavidePiras所述,创建一个服务类库并引用二进制.dll。 (在这种情况下,请拨打.dll,Worker以获取我的答案)
  2. 在您的用户控件中,不是在构造函数中实例化Worker类,而是创建一个新方法,在这种情况下将其称为LoadWorker
  3. ...

    private Worker worker;
    
    public CustomUserControl()
    {
        InitializeComponent();
    }
    
    public void LoadWorker()
    {
        worker = new Worker();
    }
    

    -

    1. 在您调用此userControl的表单中,但无法查看该表单,然后在另一个方法或表单的构造函数中调用usercontrol.LoadWorker()
    2. -

      public MyForm()
      {
          InitializeComponent()
          customUserControl.LoadWorker();
      }
      

      我从这里采取的额外步骤是关闭所有打开的窗口/文件并执行Build Solution。然后重新打开设计师失败的表格,这应该是好的。

      <强>原因吗 在运行时工作的表单与在VS20xx的设计器窗口中看到的表单相比,必须处理在运行时实例化的内容与设计器窗口加载用户控件时发生的情况。我不知道必须描述的细节或术语,但这就是导致它的原因。我发现将WCF服务加载到一个单独的方法中是最简单的解决方案。

      我希望现在可以帮助那些经营这个答案的人。