【问题标题】:WCF service is unavailable after app pool recycles应用池回收后 WCF 服务不可用
【发布时间】:2012-09-02 14:45:12
【问题描述】:

我正在开发一个使用托管在不同应用程序池中的 WCF 服务的网站,每次 WCF 服务的应用程序池回收时,我在使用该网站时都会收到 503:

[WebException: The remote server returned an error: (503) Server Unavailable.]
   System.Net.HttpWebRequest.GetResponse() +6440728
   System.ServiceModel.Channels.HttpChannelRequest.WaitForReply(TimeSpan timeout) +55

[ServerTooBusyException: The HTTP service located at http://cr.genesis.dev/Genesis/RepositoryService.svc is unavailable.  This could be because the service is too busy or because no endpoint was found listening at the specified address. Please ensure that the address is correct and try accessing the service again later.]
...

当我尝试直接在我的网络浏览器中访问该服务时,它第一次给了我一个 503,但之后它就可以工作了(大概是它导致应用程序启动?)我想知道为什么网站不是唤醒 Web 服务 - 即使我尝试多次加载页面,我仍然会收到 503...

如果这有什么不同,我将使用 Windsor WCF 集成,对我的客户端使用 LifestylePerWebRequest,对我的服务使用 LifestylePerThread。

这是我的服务配置:

<system.serviceModel>
        <services>
            <service name="Genesis.Repository.Service.RepositoryService" behaviorConfiguration="repositoryServiceBehaviour">
                <host>
                    <baseAddresses>
                        <add baseAddress="http://cr.genesis.dev/Genesis/" />
                    </baseAddresses>
                </host>
                <endpoint name="basicHttpBinding"
                    address="RepositoryService.svc"
                    binding="basicHttpBinding"
                    contract="Genesis.Repository.Service.IRepositoryService" />
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="repositoryServiceBehaviour">
                    <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                    <serviceMetadata httpGetEnabled="true" />
                    <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
    </system.serviceModel>

还有客户:

<system.serviceModel>
        <client>
            <endpoint name="basicHttpBinding"
                 address="http://cr.genesis.dev/Genesis/RepositoryService.svc"
                 binding="basicHttpBinding"
                 contract="Genesis.Repository.Service.IRepositoryService" />
        </client>
    </system.serviceModel>

任何建议将不胜感激!

【问题讨论】:

    标签: wcf web-services castle-windsor application-pool recycle


    【解决方案1】:

    看起来我让它变得比它需要的更复杂 - 我收到异常说它无法在 http://+:80 上监听,这就是为什么我使用 netsh 权限并让它监听在/Genesis

    原来我可以让它监听/并在向Windsor注册它时指定.Hosted()告诉它让IIS托管它(这正是我安装WcfFacility之前的样子!)

    吸取的教训,有时您只需回到基础,事情就会按预期进行!

    【讨论】:

      【解决方案2】:

      如果您发现“(503) 服务器不可用错误”,那么首先要检查的是服务器是否正在运行。为此,请转到 IIS 并检查网站是否打开。

      【讨论】:

      • 作者说“它第一次给我一个 503,但之后它就可以工作”所以网站肯定启动了......重试可能是最简单的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 2013-05-26
      • 2012-11-17
      • 2015-01-07
      • 2011-02-19
      • 2011-08-28
      • 1970-01-01
      相关资源
      最近更新 更多