WCF中的另一个应用程序使用的端口

时间:2010-01-13 11:18:04

标签: wcf

尝试使用以下配置运行时,我遇到了WCF自托管应用程序的问题:

  <system.serviceModel>
    <services>
      <service name="statisticsCollectingService">
        <endpoint address="net.tcp://localhost:8200/RadioStatistics/"
                binding="netTcpBinding"
                contract="RadioStatistics.Services.IStatisticsCollectingService" />
        <endpoint address="http://localhost:8100/RadioStatistics/"
                binding="basicHttpBinding"
                contract="RadioStatistics.Services.IStatisticsCollectingService" />
      </service>

      <service name="biDataExportService">
        <endpoint address="net.tcp://localhost:8001/RadioStatistics/" 
                  binding="netTcpBinding" 
                  contract="RadioStatistics.Services.IBIDataExportService" />
      </service>
    </services>
  </system.serviceModel>

异常发生如下:

System.Configuration.ConfigurationErrorsException: Error creating context 'spring.root': The process cannot access the file because it is being used by another process ---> Spring.Objects.Factory.ObjectCreationException: Error creating object with name 'statisticsCollectingServiceHost' defined in 'config [C:\TTL\zer_rel_12_1_main_TTL_C1077\TTL\CommonTools\RadioStatistics\bin\Debug\RadioStatistics.ServerApp.vshost.exe.Config#spring/objects] line 4' : Initialization of object failed : HTTP could not register URL http://+:8000/RadioStatistics/services/ because TCP port 8000 is being used by another application. ---> System.ServiceModel.AddressAlreadyInUseException: HTTP could not register URL http://+:8000/RadioStatistics/services/ because TCP port 8000 is being used by another application. ---> System.Net.HttpListenerException: The process cannot access the file because it is being used by another process
   at System.Net.HttpListener.AddAll()
   at System.Net.HttpListener.Start()
   at System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
   --- End of inner exception stack trace ---
   at System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
   at System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener)
   at System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback)
   at System.ServiceModel.Channels.TransportChannelListener.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.HttpChannelListener.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open()
   at Spring.ServiceModel.Activation.ServiceHostFactoryObject.AfterPropertiesSet() in l:\projects\spring-net\trunk\src\Spring\Spring.Services\ServiceModel\Activation\ServiceHostFactoryObject.cs:line 176
   at Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.InvokeInitMethods(Object target, String name, IConfigurableObjectDefinition definition) in l:\projects\spring-net\trunk\src\Spring\Spring.Core\Objects\Factory\Support\AbstractAutowireCapableObjectFactory.cs:line 1264
   at Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.ConfigureObject(String name, RootObjectDefinition definition, IObjectWrapper wrapper) in l:\projects\spring-net\trunk\src\Spring\Spring.Core\Objects\Factory\Support\AbstractAutowireCapableObjectFactory.cs:line 1860
   at Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.InstantiateObject(String name, RootObjectDefinition definition, Object[] arguments, Boolean allowEagerCaching, Boolean suppressConfigure) in l:\projects\spring-net\trunk\src\Spring\Spring.Core\Objects\Factory\Support\AbstractAutowireCapableObjectFactory.cs:line 884
   --- End of inner exception stack trace ---
   at Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.InstantiateObject(String name, RootObjectDefinition definition, Object[] arguments, Boolean allowEagerCaching, Boolean suppressConfigure) in l:\projects\spring-net\trunk\src\Spring\Spring.Core\Objects\Factory\Support\AbstractAutowireCapableObjectFactory.cs:line 901
   at Spring.Objects.Factory.Support.AbstractObjectFactory.CreateAndCacheSingletonInstance(String objectName, RootObjectDefinition objectDefinition, Object[] arguments) in l:\projects\spring-net\trunk\src\Spring\Spring.Core\Objects\Factory\Support\AbstractObjectFactory.cs:line 2097
   at Spring.Objects.Factory.Support.AbstractObjectFactory.GetObjectInternal(String name, Type requiredType, Object[] arguments, Boolean suppressConfigure) in l:\projects\spring-net\trunk\src\Spring\Spring.Core\Objects\Factory\Support\AbstractObjectFactory.cs:li

运行Windows XP SP3已经尝试执行以下操作:

  

httpcfg set urlacl / u http://+:8100/RadioStatistics/ / a“D:(A ;; GX ;;; BU)”

(我想所有可能的一般拨款和/或用户的变体 - 比如DU(对于域用户?)

还尝试添加到IP列表

  

httpcfg set iplisten -i 0.0.0.0:8100

这是在我在事件日志中找到事件之后:

  

无法绑定到底层证券   运输0.0.0.0:8100。知识产权   Listen-Only列表可能包含   参考可能的接口   这台机器上不存在。数据   字段包含错误号。

最糟糕的是它已经在过去工作(几周前我去度假之前)。机器似乎没有改变,因为它没有被触及。但这个错误让我发疯。最糟糕的是无论选择哪个端口都会发生错误。

在删除basicHttpBinding之后,它的工作方式绝对正常。

TIA

罗兰

4 个答案:

答案 0 :(得分:6)

您可能在同一端口上侦听其他内容。尝试运行

netstat -o -n -a 

获取所有进程的列表以及他们正在侦听的内容。

答案 1 :(得分:0)

我认为这与在.NET 3.5中配置服务然后更改为.NET 4.0有关 - 服务配置默认值已经彻底改变,现在默认情况下会创建许多端点。 http://blogs.msdn.com/b/endpoint/archive/2009/06/30/service-configuration-improvements-in-net-4.aspx

答案 2 :(得分:0)

@Roland,我知道这是一篇非常古老的帖子,我也见过你在其他网站上问这个问题。我最近有这个问题很长一段时间了。最终我有两种解决方法。 1)虽然这可能不是推荐的方法,但是在运行窗口服务的帐户上获得本地管理员权限。这就是为什么当人们以管理员身份运行VS时,这个问题会在本地计算机上消失,因为HTTP默认授予本地管理员权限。

2)如你所说,在xp / 2003服务器上使用httpcfg配置你的URL和端口号;值得一提的是"D:(A;;GX;;;LS)"是对我有用的正确SDDL;我尝试过其他人,但没有工作。同样重要的是,在配置仅使用httpcfg set urlacl -u http://+:portnumber -a D:(A;;GX;;;LS)"时,请不要包含服务名称。并且不要使用httpcfg配置iplisten,因为这很可能会阻止IIS在服务器上运行。您从事件日志中获得的错误:&#34;无法绑定到0.0.0.0:8100的基础传输。 IP Listen-Only列表可能包含对此计算机上可能不存在的接口的引用。数据字段包含错误号&#34;表明IIS已停止。事实上,如果你httpcfg query iplisten,你应该只看到默认的ipaddress 0.0.0.0。使用httpcfg配置URL后,您需要使用net stop http重新启动http并等待所有内容成功停止。然后做net start http。如果http无法正常停止,则需要重新启动服务器,之后IIS应该运行(如果您删除了任何无效的ipaddress)。然后启动窗口服务并检查netstat -an | findstr "0.0:yourportnumber"是否有结果,这意味着您的窗口服务现在正在运行。

添加,我已按照我们的第一台开发服务器上的说明进行操作,但最初没有工作,因为1)我添加了iplisten和2)配置url后我没有重新启动http。 3)我没有检查以确保iis正常运行。 希望这会有所帮助。

答案 3 :(得分:0)

通过右键单击Visual Studio应用程序图标并选择“以管理员身份运行”,可以解决此问题。

这是Microsoft官方文档页面的摘录:

该服务必须以管理员权限运行。因为您以管理员权限打开了Visual Studio,所以当您在Visual Studio中运行GettingStartedHost时,应用程序也将以管理员权限运行。或者,您可以以管理员身份打开新的命令提示符(从快捷菜单中选择“更多”>“以管理员身份运行”),然后在其中运行GettingStartedHost.exe。

https://docs.microsoft.com/en-us/dotnet/framework/wcf/how-to-host-and-run-a-basic-wcf-service

您可能还需要更改端口号。