无法在本地网络中远程访问WCF自托管服务

时间:2016-01-13 18:52:05

标签: c# web-services wcf

我目前正在创建WCF自托管服务(托管在ConsoleApplication中)。服务合同很简单,它只包含两种方法。当我在本地机器上本地托管服务时,一切都很好。当我尝试托管它以从本地网络中的其他机器访问时,事情变得复杂。我可以通过所有机器上的浏览器访问 - 没问题就在这里。但是,当我只尝试创建客户端应用程序并调用某些方法时,我得到以下异常:

  

其他信息:> http://localhost:9001/ValueDataService没有可以接受该消息的端点。这通常是由不正确的地址或SOAP动作引起的。有关详细信息,请参阅InnerException,如果>存在。

内部异常:

  

远程服务器返回错误:(404)Not Found。

我感到困惑,因为我可以通过浏览器输入http://localhost:9001/ValueDataService地址远程访问它。客户端应用程序始终抛出异常。

只是为了简化: 要通过浏览器(而不是单个localhost机器)在本地网络中的其他计算机上看到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"/>

  

至少是Client Application 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 个答案:

答案 0 :(得分:0)

更新:

因此,IIS有一个烦人的绑定系统,它不会将IP地址请求转换为localhost绑定。它和不幸的事情,但这就是它的请求系统如何工作。在调试中运行WCF服务时,它会运行带有localhost绑定的IIS express实例。因此,当请求通过时,它不会转换为运行实例的绑定地址。

如何解决这个问题:

1)启动IIS 2)使用合适的IP地址绑定在IIS中托管您的已开发应用程序

OLD: 在链接中:http://localhost:9001/ValueDataServicelocalhost替换为服务器的IP地址,以便链接如下所示:http://192.168.1.5:9001/ValueDataService转到网络并共享中心/使用ipconfig获取服务器计算机的IP地址。

localhost链接不起作用的原因是因为当浏览器读取localhost时它解析它会查看计算机自己的网络接口,而不是向外看。

我希望它有所帮助。