2010-07-06 55 views
12

對不起,長期問題陳述...我花了兩天時間調試,並有很多筆記...「找不到名稱爲...的端點元素」

我有一個WCF數據服務另一個進程試圖通過TCP和/或HTTP作爲客戶端連接到它。

我有一個非常簡單的測試客戶端應用程序似乎連接正常,但更復雜的生產應用程序無法連接(既不是TCP或HTTP)。在這兩個客戶端項目中,我讓Visual Studio 2008使用「添加服務引用」來生成app.config,並讓它從數據服務中提取元數據。

下面是簡單的測試客戶端,工作代碼:

using Client.MyDataService; 

namespace Client 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyDataServiceClient client = new MyDataServiceClient("net.tcp"); 

      client.GetRecords(); 
     } 
    } 
} 

這裏是一個更復雜,生產客戶端代碼:

DataServiceManager.cs:

using MyServer.MyDataService; 

namespace MyServer.DataServiceBridge 
{ 
    class DataServiceManager 
    { 
     MyDataServiceClient dataServiceClient = new MyDataServiceClient("net.tcp"); 
} 
} 

主要工藝流程:

DataServiceManager d = new DataServiceManager(); 

下面是兩個簡單的客戶端和客戶端的生產app.config文件:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <netTcpBinding> 
       <binding name="net.tcp" closeTimeout="00:01:00" openTimeout="00:01:00" 
        receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" 
        transferMode="Buffered" transactionProtocol="OleTransactions" 
        hostNameComparisonMode="StrongWildcard" listenBacklog="10" 
        maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10" 
        maxReceivedMessageSize="65536"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
        <security mode="Transport"> 
         <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
         <message clientCredentialType="Windows" /> 
        </security> 
       </binding> 
      </netTcpBinding> 
     </bindings> 
     <client> 
      <endpoint address="net.tcp://localhost:8888/MyDataService" 
       binding="netTcpBinding" bindingConfiguration="net.tcp" contract="MyDataService.IMyDataService" 
       name="net.tcp"> 
       <identity> 
        <userPrincipalName value="COMPUTER_NAME\Username" /> 
       </identity> 
      </endpoint> 
     </client> 
    </system.serviceModel> 
</configuration> 
  • 服務器myserver的bin \調試\文件夾是 MyServer.exe,app.config中。

  • 在MyDataSeriviceHost的bin \調試\ 文件夾是MyDataService.exe, 的app.config和 MyDataSeriviceHost.exe.config。 的app.config和 MyDataSeriviceHost.exe.config是 相同。

以下是錯誤消息:

An exception of type 'System.InvalidOperationException' occurred in System.ServiceModel.dll but 
was not handled in user code 

Additional information: Could not find endpoint element with name 'net.tcp' and contract 
'MyDataService.IMyDataService' 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 name could be found in the client element. 

任何想法是怎麼回事?我已經用盡了Google。 :-(

+1

可能是一個錯字,但你的錯誤消息讀取:IyDataService。應該可能是IMyDataService。 – 2010-07-06 18:15:13

+0

是的,這是在這裏發佈的編輯錯誤。修正了,謝謝! – CrypticPrime 2010-07-06 18:16:52

+0

請不要在標題中重複「WCF」等標籤。這就是標籤的用途。 – 2010-07-06 18:20:07

回答

18

解決

事實證明,我們有一個加載DLL exe文件。 該DLL包含了WCF客戶端。 在編譯時,MyServer.dll.config產生,但由於該exe是本地(不是.NET)它不會自動.config文件讀取。我們需要做手工。 ŧ他的鏈接允許我手動加載配置並創建一個CustomChannelFactory>來解決這個問題。

對於任何人需要同樣的事情,這裏是導致該解決方案的鏈接: http://www.paraesthesia.com/archive/2008/11/26/reading-wcf-configuration-from-a-custom-location.aspx

3

可能只是你寫它的方式,但它聽起來像你的配置文件不被複制到正確的目錄。它應該有一個匹配的名稱,以您的應用程序沒有的app.config。如果你嘗試改變app.config文件到[您的exe文件名] .exe.config的名稱有何幫助。

+0

我也嘗試過。這是行不通的。 app.config和MyServer.exe.config都在那裏(我嘗試刪除一個或另一個太踢只)。 – CrypticPrime 2010-07-06 18:18:50

+0

那麼只是爲了將來的參考app.config將永遠不會工作,因爲它不會被拿起。因此,這兩個應用程序都有.config文件,其中的名稱與當前exe的名稱相匹配。您是否可能將簡單應用中的配置複製到複雜的應用中,並忘記更改配置的名稱? – spinon 2010-07-06 18:22:15

+0

不幸的是,我希望事實如此。所有文件名都是正確的。 – CrypticPrime 2010-07-06 18:27:38

5

我有這樣的情況,在那裏我有

  • WCF服務地方託管
  • 主項目
  • 類型'類庫'的消費者項目,其具有對WCF服務的服務引用
  • 主項目ECT要求從消費項目

現在消費項目已全部<system.serviceModel>標籤我的app.config的相關配置設置,它仍然拋出了同樣的錯誤作爲上述方法。

我所做的只是將相同的標記<system.serviceModel>添加到我的主項目的app.config文件中,最後我們很高興。

真正的問題,就我而言,它是讀錯了配置文件。而不是消費者的app.config,它是指主proj的配置。我花了兩個小時才弄明白這一點。

1

當EXE消耗DLL時,它查找的配置文件不是DLLName.Dll.Config其EXEName.exe.config,更改生成的配置文件的名稱並將其複製到執行路徑。它應該工作。

乾杯!!!!!!!!!

0

有不同的解決方案類似的情況,可能是使用的這些特殊情況:

  • 像上面的帖子,我有託管在DLL中定義客戶端的EXE。

  • 不同於上述的情況是,到 發現服務端點我的客戶端是使用UDP探測(明顯的服務,使MEX)

的ClientProxy繼承DuplexClientBase和重載實例方法允許你指定綁定和端點而不需要任何配置文件。

一個VB例子中,我發現了一個端點(EP),我知道綁定TCP安全禁用,這樣我就可以實例化並使用回調客戶端爲:

myClientProxy = New ClientProxy(New InstanceContext(Me), New NetTcpBinding(SecurityMode.None), ep.Address) 
相關問題