2016-01-13 106 views
3

我正在創建WCF自託管服務(託管在ConsoleApplication中)。服務合同很簡單,只包含兩種方法。當我在本地機器上本地託管服務時,一切都很好。當我嘗試託管它以從本地網絡中的其他機器訪問時,情況變得複雜。我可以通過所有機器上的瀏覽器訪問 - 這裏沒有問題。但是,當我只嘗試創建客戶端應用程序,並調用一些方法,我得到以下異常:WCF自託管服務在本地網絡中無法遠程訪問

Additional information: There was no endpoint listening at >http://localhost:9001/ValueDataService that could accept the message. This is >often caused by an incorrect address or SOAP action. See InnerException, if >present, for more details.

內部異常:

The remote server returned an error: (404) Not Found.

我感到困惑,因爲我可以通過瀏覽器中鍵入http://localhost:9001/ValueDataService遠程訪問地址。客戶端應用程序始終引發上述異常。

只是爲了得到簡化事情: 要獲得WCF服務通過瀏覽器(而不是單個本地主機機)在本地網絡中的其他計算機上可見,我必須要改變的唯一事情就是添加

hostNameComparisonMode="Exact" 

屬性到端點綁定。

更新: 當然改變localhost到主機的IP地址。

服務合同的樣子:

[ServiceContract] 
public interface IValuesDataService 
{ 
    [OperationContract] 
    int[] GetValues(); 

    [OperationContract] 
    void SetValues(int[] values); 
} 

控制檯應用程序是這樣的:

static void Main(string[] args) 
    { 
     ServiceHost svcHost = null; 
     try 
     { 
      svcHost = new ServiceHost(typeof(ValueDataService.ValueDataService)); 
      svcHost.Open(); 
      Console.WriteLine("Value Data Service has been hosted."); 
     } 
     catch (Exception e) 
     { 
      svcHost = null; 
      Console.WriteLine("Service can not be started \n\nError Message [" + e.Message + "]"); 
     } 
     if (svcHost != null) 
     { 
      Console.WriteLine("\nPress any key to close the Service"); 
      Console.ReadLine(); 
      svcHost.Close(); 
      svcHost = null; 
     } 
    } 

主機應用程序App.config文件:

<?xml version="1.0"?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service name="ValueDataService.ValueDataService"  behaviorConfiguration="mathServiceBehave"> 
     <host> 
      <baseAddresses> 
     <add baseAddress="http://localhost:9001/ValueDataService"/> 
     </baseAddresses> 
    </host> 
    <endpoint address="" binding="basicHttpBinding" contract="ValueDataService.IValueDataService"/> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="mathServiceBehave"> 
     <serviceMetadata httpGetEnabled="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<bindings> 
    <basicHttpBinding> 
    <binding name="bindingName" hostNameComparisonMode="Exact"> 
     <security mode="None"/> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
</system.serviceModel> 
<startup> 
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> 

和至少客戶端應用程序App.config文件:

<?xml version="1.0"?> 
<configuration> 
<startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> 
</startup> 
<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="myBinding"> 
      <security mode="None"/> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:9001/ValueDataService" binding="basicHttpBinding" contract="ValueDataServiceReference.IValueDataService"/> 
    </client> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="webEndpoint"> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
</system.serviceModel> 
</configuration> 

誰能幫我得到這個工作?

+1

您無法通過'localhost'遠程訪問它,這就是「本地」機器。將客戶端的app.config更改爲使用託管服務器應用程序的計算機的IP。 – DrewJordan

+0

就像你在你的機器上託管WCF服務一樣,你必須將'localhost'改爲你的內部IP地址。你確實需要保留端口號(:9001)。 –

+0

哦,我的壞,我沒有寫,但是,當然我使用主機的IP地址,如http://192.168.0.16/ValueDataService – smq93

回答

0

UPDATE:

所以IIS具有不轉換IP地址的請求到本地主機綁定一個惱人的約束制度。它的和不幸的事情,但這就是它的請求系統如何工作。當您在調試中運行WCF服務時,它將使用本地主機綁定運行IIS Express實例。因此,當請求到達時,它不會被轉換爲實例正在運行的綁定地址。

如何解決這個問題:

1)啓動IIS 2)用合適的IP地址綁定

舊主機在IIS你開發的應用程序: 在鏈接:http://localhost:9001/ValueDataService與服務器的IP地址替換localhost以便該鏈接看起來像:http://192.168.1.5:9001/ValueDataService轉到網絡和共享中心/使用ipconfig獲取服務器計算機的IP地址。

本地主機鏈接不起作用的原因是因爲當瀏覽器讀取本地主機時,它解決了它看起來在計算機自​​己的網絡接口,而不是向外看。

我希望它有幫助。

+0

我剛剛更新了我的問題,當然我將本地主機更改爲IP地址主機也是如此。我還寫道,我有權訪問其他機器,但只能通過瀏覽器訪問。 – smq93

+0

很久以前有人在嘗試錯誤的IP。我認爲你必須改變默認綁定,這可能是一些愚蠢的IIS中間件,它無法識別WCF中的本地主機綁定。 – rkrishnasanka

相關問題