2016-02-07 52 views
5

我正尝试使用wget/invoke-webrequest浏览嵌入式web服务器上的命令。如何避免这个错误?Powershell wget协议违规

wget:服务器提交协议违规。第= ResponseHeader详细= CR必须跟有LF

已经尝试过许多东西,例如下面没有成功:

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} 

当使用BITS相反,这是我得到

错误

start-bitstransfer:服务器没有返回文件大小。该网址可能指向动态内容。内容长度标头在 服务器的HTTP回复中不可用。

非常感谢您的帮助 克莱姆

+0

所以之前你已经尝试了两个客户端:[wget](https://www.gnu.org/software/wget/)(来自Powershell)和[Microsoft BITS](https://msdn.microsoft.com/en-us/库/ aa362708%28V = vs.85%29.aspx)。在这两种情况下,您都会从服务器上收到“协议错误”。嗯......问:如果从命令行或.bat文件运行wget,会发生什么?问:你能否成功地从* ANY *客户端与服务器通话?问:服务器应该做什么?究竟是什么*失败的回应,以及如何实施? – paulsm4

+0

@ paulsm4 wget别名为'Invoke-WebRequest' –

+0

这是正确的,两者都有类似的问题。尝试从支持WiFi的相机下载照片。与嵌入式服务器的连接很好。当我用wget在linux中做同样的事情时,它工作得很好。尽管如此,宁愿使用BITS。 – clem

回答

6

设置ServerCertificateValidationCallback代表不会帮助你 - SSL/TLS是协议被称为 - 对违反协议是与问候到HTTP标题(例如之后的长已经建立)。

有一个.NET configuration flag called useUnsafeHeaderParsing控制是否忽略这种违规行为。

使用反射,它也可以从运行时设置。 This Technet forum answer给予的如何在PowerShell中这样做的一个很好的例子,我们可以包装在一个漂亮的函数象下面这样:

function Set-UseUnsafeHeaderParsing 
{ 
    param(
     [Parameter(Mandatory,ParameterSetName='Enable')] 
     [switch]$Enable, 

     [Parameter(Mandatory,ParameterSetName='Disable')] 
     [switch]$Disable 
    ) 

    $ShouldEnable = $PSCmdlet.ParameterSetName -eq 'Enable' 

    $netAssembly = [Reflection.Assembly]::GetAssembly([System.Net.Configuration.SettingsSection]) 

    if($netAssembly) 
    { 
     $bindingFlags = [Reflection.BindingFlags] 'Static,GetProperty,NonPublic' 
     $settingsType = $netAssembly.GetType('System.Net.Configuration.SettingsSectionInternal') 

     $instance = $settingsType.InvokeMember('Section', $bindingFlags, $null, $null, @()) 

     if($instance) 
     { 
      $bindingFlags = 'NonPublic','Instance' 
      $useUnsafeHeaderParsingField = $settingsType.GetField('useUnsafeHeaderParsing', $bindingFlags) 

      if($useUnsafeHeaderParsingField) 
      { 
       $useUnsafeHeaderParsingField.SetValue($instance, $ShouldEnable) 
      } 
     } 
    } 
} 

然后使用类似:

Set-UseUnsafeHeaderParsing -Enable 

调用Invoke-WebRequest

+0

感谢您的快速回复 当使用反射我得到这个错误,我无法解决 异常调用“2”参数的“SetValue”:“对象类型'System.Management.Automation。SwitchParameter'无法转换为类型 'System.Boolean'。“ – clem

+0

@clem我已更新脚本以避免:) –

+0

这就是它,非常感谢@Mathias! – clem