使用WCF客户端/服务的WPF应用程序无法找到端点元素

时间:2011-12-17 01:53:58

标签: wpf wcf com

忍受我一会儿,我想布置整个画面。 我有一个WPF应用程序(.exe),它需要在COM对象(VB6宏)调用应用程序方法时打开并显示一个窗口。我已经在.exe解决方案COM中创建了一个托管代码项目,VB6宏成功调用了此托管代码项目(COM存根)上的方法。

我的COM存根接收方法调用并在第一次传递命令行参数的WPF exe上运行Process.Start。我的应用程序按预期启动。我现在需要通过我的COM存根从VB6宏发送数据,并在连续调用时发送到WPF exe。我在我的WPF exe解决方案中添加了一个WCF项目,生成了“netNamedPipeBinding”服务。我在COM存根中添加了一个ServiceReference来与WPF exe进行通信。我已经使用控制台应用程序单独测试了WCF服务,但它确实有效。我使用与我的测试用例相同的元数据地址构建了COM存根ServiceReference,并且它正常构建了引用。

我的测试驱动程序调用COM存根方法并启动WPF应用程序。我对COM存根的下一次调用尝试实例化服务客户端,我得到了可怕的错误: “无法在ServiceModel客户端配置部分找到名称为'internal'且收缩'SelectedStudentReference.ISelectedStudent'的端点元素。”

以下是我在WPF exe解决方案的WCF服务项目部分中的app.config的内容。

 <system.serviceModel>
   <bindings />
   <client />
   <services>
     <service name="AwardManager.Service.SelectedStudentService">
       <host>
         <baseAddresses>
           <!--<add baseAddress = "http://localhost:8080/SelectedStudent" />-->
           <add baseAddress="net.pipe://localhost/SelectedStudent"   />
         </baseAddresses>
       </host>
       <endpoint
          name="internal"
          address="net.pipe://localhost/"
          binding="netNamedPipeBinding"
          contract="AwardManager.Service.ISelectedStudent"
        />
       <endpoint
         address="mex/pipes"
         binding="mexNamedPipeBinding"
         contract="IMetadataExchange"
       />
     </service>
   </services>
   <behaviors>
     <serviceBehaviors>
       <behavior>
         <serviceMetadata httpGetEnabled="False"/>
         <serviceDebug includeExceptionDetailInFaults="False" />
       </behavior>
     </serviceBehaviors>
   </behaviors>
 </system.serviceModel>

我已经尝试将其复制到WPF app.config中,但没有成功。此服务适用于控制台应用程序测试驱动程序。由于这是我第一次使用WCF,我对下一个故障排除步骤感到茫然。我看了another Stackflow question,但无法弄清楚它是否适用于我的情况。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

它总是你看的最后一个地方。我的控制台应用程序测试驱动程序正在调用带有ServiceReference的COM存根。我在创建ServiceClient的调用之前添加了这行代码。

string dir = System.IO.Directory.GetCurrentDirectory();

这表明客户端是在测试驱动程序目录中创建的。我将这个从我的COM存根复制到测试驱动程序的app.config中。现在就像一个冠军。

<system.serviceModel>
   <bindings>
      <netNamedPipeBinding>
         <binding name="internal" closeTimeout="00:01:00" openTimeout="00:01:00"
             receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
             transferMode="Buffered" transactionProtocol="OleTransactions"
             hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
             maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            <security mode="Transport">
               <transport protectionLevel="EncryptAndSign" />
            </security>
         </binding>
      </netNamedPipeBinding>
   </bindings>
   <client>
      <endpoint
         address="net.pipe://localhost/"
         binding="netNamedPipeBinding"
         bindingConfiguration="internal"
         contract="SelectedStudentReference.ISelectedStudent"
         name="internal">
         <identity>
            <userPrincipalName value="me@xyz.com" />
         </identity>
      </endpoint>
   </client>
</system.serviceModel>

答案 1 :(得分:0)

这导致我的解决方案:将服务引用内容移动到'main'app.config文件,然后可以通过'child'(wpf)项目找到它。