2016-02-07 61 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