WPF UserControl库中的WCF服务引用

时间:2014-07-25 13:51:28

标签: c# wpf wcf c#-4.0

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

例如:

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

如果我创建一个WPF UserControl,我在其中添加WCF服务引用并实例化: Service1Client svc = new Service1Client();   - 一切都编译得很好(不能调试,因为它只是一个UserControl)。

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

  

类型' System.InvalidOperationException'的例外情况发生在System.ServiceModel.dll中但未在用户代码中处理   附加信息:找不到引用合同的默认端点元素' ServiceReference1.IService1'在ServiceModel客户端配置部分中。这可能是因为没有为您的应用程序找到配置文件,或者因为在客户端元素中找不到与此合同匹配的端点元素。

那是怎么回事?为什么我不能在另一个WPF MainApplication中使用的WPF UserControl中使用WCF服务引用?

我搜索并搜索了这个,但没有找到任何帮助。

祝你好运

编辑#1

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

  

类型' System.InvalidOperationException'的例外情况发生在System.ServiceModel.dll中但未在用户代码中处理   附加信息:找不到引用合同的默认端点元素' ServiceReference1.IService1'在ServiceModel客户端配置部分中。这可能是因为没有为您的应用程序找到配置文件,或者因为在客户端元素中找不到与此合同匹配的端点元素。

我想问题是MainApplication不会从UserControl库的app.config知道端点。

我必须将此部件从app.config(UserControl Library)复制到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>

但是我仍然在MainWindow.xaml中的Visual Studio i live design视图中遇到错误

<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(无法创建&#34; UserControl1&#34的实例;)

从错误列表中:

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

3 个答案:

答案 0 :(得分:0)

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

<强>更新

对于你得到的第二个错误,这可能是由VS设计师造成的。

答案 1 :(得分:0)

有趣的是,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>

注意&#34;合同&#34;。

但是如果我从svcutil复制/粘贴配置,我会在VS中获得错误。和我的第一个相同。所以似乎合同合同=&#34; ServiceReference1.IService1&#34; - 但有趣的是,svcutil会输出不同的东西吗?

答案 2 :(得分:0)

搞定了!!

使用svcutil的输出更新了USERCONTROL中的app.config,并将其再次编译。 现在设计视图有效:)