【问题标题】:New-WebServiceProxy cmdlet fails with "The operation has timed out" exceptionNew-WebServiceProxy cmdlet 因“操作已超时”异常而失败
【发布时间】:2013-12-10 16:40:11
【问题描述】:

我正在使用 PowerShell 部署 ASP.NET 应用程序。它包括 Web 服务,我需要在部署 Web 应用程序后立即调用它的方法之一。显然,这个请求需要一些时间,因为它应该“预热”网站。

所以,我直接调用New-WebServiceProxy 来获取代理对象,然后调用一个方法:

$ps = New-WebServiceProxy -Uri "http://mysite/folder/myservice.asmx"

但是,此操作需要一些时间,并且总是会因超时异常而失败。我应该说这一切都发生在远程会话中。当应用程序在本地部署时(因此脚本在本地会话中运行),调用成功。

我已经在 web.config 中验证了 <httpRuntime>executionTimeout - 它有相当大的超时。但我的假设是在第一次调用之前没有考虑到它。所以,我认为这是New-WebServiceProxy 的一些属性/开关,应该会影响这种行为,但我没有找到它。

有人有想法吗?

附:我使用的是 PowerShell 2.0,但如果解决方案在 v3.0 中,则可以接受。

【问题讨论】:

    标签: asp.net web-services powershell timeout powershell-2.0


    【解决方案1】:

    如果问题确实是超时,请在 PowerShell V3 上尝试这种方法:

    $wr = Invoke-WebRequest http://mysite/folder/myservice.asmx?wsdl -TimeoutSec 30
    $wr.Content | Out-File -enc utf8 c:\myservice.wsdl
    $ps = New-WebServiceProxy file:///c:\myservice.wsdl
    

    顺便说一句,您的问题可能是 URI 上缺少 ?wsdl

    【讨论】:

    • 感谢您的回答,基思!此解决方法有效。问题不在?wsdl,我验证了这一点。实际上,这里的诀窍是通过Invoke-WebRequest 预热网站。如果您省略第 2 行并使用原始 URL 运行 New-WebServiceProxy - 它也可以。我最终为我的案例进行了类似的工作。再次感谢您。
    • Keith,如果您认为我下面的解决方法比您建议的更糟糕,请告诉我。我在 PowerShell 中还没有那么好......
    • @YanSklyarenko 这对于 V2 来说是一个很好的解决方法。昨晚我只是没有时间弄乱 V2 上的 API 调用。
    • 太棒了!再次感谢您的帮助,基思!
    【解决方案2】:

    我最终得到的解决方法是在部署之后和调用 web 方法之前预热网站。像这样的东西(也适用于 PowerShell 2.0):

    $request = [system.net.WebRequest]::Create("http://mysite")
    $request.Timeout = 2400000   # some big enough timeout goes here
    $request.GetResponse() | Out-Null
    

    在此之后,对New-WebServiceProxy 的调用成功,就可以调用web 方法了。

    【讨论】:

    • 这很好。 Invoke-WebRequest 对 Internet Explorer 有某种依赖性(因此您必须与具体用户至少设置一次 IE),而此解决方案不需要任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2022-08-13
    • 2015-11-26
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    相关资源
    最近更新 更多