WPF 用户控件库中的 WCF 服务引用

Posted

技术标签:

【中文标题】WPF 用户控件库中的 WCF 服务引用【英文标题】:WCF service reference in WPF UserControl Library 【发布时间】:2014-09-17 09:40:27 【问题描述】:

我有一个简单的 WCF Web 服务,如果我创建一个新的简单 C# WPF 应用程序并添加 WCF 服务参考,该服务效果很好。然后我可以从 WCF 服务访问方法/操作合同。

例如:

Service1Client svc = new Service1Client();
        svc.GetData()

如果我创建一个 WPF 用户控件,我在其中添加 WCF 服务引用并实例化: Service1Client svc = new Service1Client(); - 一切都再次编译正常(无法调试,因为它只是一个用户控件)。

但是,如果我将 .dll 从 UserControl 导入到新的 C# WPF 应用程序并在 MainWindow.xaml 中使用 UserControl,则会失败:

System.ServiceModel.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理 附加信息:在 ServiceModel 客户端配置部分中找不到引用合同“ServiceReference1.IService1”的默认端点元素。这可能是因为找不到您的应用程序的配置文件,或者因为在客户端元素中找不到与此协定匹配的端点元素。

怎么样?为什么我不能在另一个 WPF 主应用程序中使用的 WPF 用户控件中使用 WCF 服务引用?

我已经搜索并搜索了这个,但没有找到任何有用的东西。

最好的问候

编辑#1

我将 System.ServiceModel 添加到我的 MainApplication(感谢您指出)我得到了同样的错误

System.ServiceModel.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理 附加信息:在 ServiceModel 客户端配置部分中找不到引用合同“ServiceReference1.IService1”的默认端点元素。这可能是因为找不到您的应用程序的配置文件,或者因为在客户端元素中找不到与此协定匹配的端点元素。

我猜问题是 MainApplication 不知道端点,来自 UserControl 库中的 app.config。

我必须将此部分从 app.config(用户控件库)复制到 MainApplication App.config 它将编译并启动并且它可以工作。

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IService1" />
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="DELETED" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
            name="BasicHttpBinding_IService1" />
    </client>
</system.serviceModel>

但我仍然在 Visual Studio 中遇到错误,我在 MainWindow.xaml 中进行设计视图

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfControlLibrary1="clr-namespace:WpfControlLibrary1;assembly=WpfControlLibrary1" x:Class="WpfApplication1.MainWindow"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <WpfControlLibrary1:UserControl1/>
</Grid>

我收到错误,在实时视图中看不到 UserControl(无法创建“UserControl1”的实例)

从错误列表中:

Error   1   Could not find default endpoint element that references contract 'ServiceReference1.IService1' 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.    DELETED\WpfApplication1\WpfApplication1\MainWindow.xaml 7   9   WpfApplication1

【问题讨论】:

我猜想用户控件正在 devenv.exe 中被实例化,这意味着你的配置文件都没有发挥作用。 您好 usr,无论如何我可以更改 Visual Studio 以至少显示 UserControl 而不仅仅是有点红色的错误交叉?它运行良好并从 WCF 服务获取数据。只有不起作用的设计视图。但这仍然很烦人。 【参考方案1】:

根据您收到的错误,您需要从您的主 WPF 应用程序中引用 System.ServiceModel 命名空间。

更新

对于您遇到的第二个错误,这可能是由于 VS 设计器造成的。

【讨论】:

如果应用编译运行正常,可能是VS设计器的问题。 一切正常,只是在设计视图中我看不到我的 UserControl。似乎这被记录在这里:***.com/questions/699644/… - 我做了同样的事情,然后它会编译并运行,但我的设计视图仍然搞砸了:(【参考方案2】:

有趣的是,svcutil.exe 的输出是

    <system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IService1" />
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://REMOED/Service1.svc" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
            name="BasicHttpBinding_IService1" />
    </client>
</system.serviceModel>

来自 UserControl 的 App.config 是:

  <system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IService1" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://REMOVED/Service1.svc" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
      name="BasicHttpBinding_IService1" />
</client>

注意“合同”。

但是如果我从 svcutil 复制/粘贴配置,我会在 VS 中得到错误。和我的第一个一样。所以看起来正确的合同是 contract="ServiceReference1.IService1" - 但有趣的是 svcutil 输出的东西不同?

【讨论】:

【参考方案3】:

知道了!!

使用 svcutil 的输出更新了我的 USERCONTROL 中的 app.config 并再次编译它。 现在设计视图工作:)

【讨论】:

以上是关于WPF 用户控件库中的 WCF 服务引用的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF 用户控件库中使用 MaterialDesignInXamlToolkit

wpf怎么使用WindowsFormsHost(即winform控件)

x:在用户控件库中找不到类型

WPF 将窗口控件封装到类库中使用

如何引用VB6.0编 用户自定义控件

处理 WPF 自定义控件库中的所有异常