2017-01-12 5 views
0

私はwifiチップ(esp8266、LUAで書かれた、nodeMCU上で動作する)上で実行されている単純なWebサーバーを持っています。どのブラウザでもウェブサイトに問い合わせると、期待通りの応答が得られ、ブラウザに表示されます(約45文字)。私はC#またはPowerShellでそれを照会すると、私が手:下層の接続が閉じられました。ブラウザで動作します

は「基になる接続が閉じられました:接続が予期せず を閉じました。」

多くのフォーラムで多数のオプションが提案されていますが、そのうちのどれも機能していないようです。

IEやChromeの場合と同じようにWebリクエストを行う方法はありますか?私は、ブラウザが内部的に何をしているのかわからないので、問題なくレスポンスを得ることができます。なぜこれは.NETの問題ですか?

私のスクリプトは以下の通りです。私は、PhantomJS(ヘッドレスブラウザ)を起動し、次にjavascriptを使ってWebサイトを開いて応答を返すことを考えています。あるいは、.NETラッパーに頼るのではなく、ソケットを使用して接続を開いてそのようにします。

# Set the useUnsafeHeaderParsing property to true 
$netAssembly = [Reflection.Assembly]::GetAssembly([System.Net.Configuration.SettingsSection]) 
$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, $true) 
    } 
} 

# Try setting the certificate policy to a custom child class that always returns true 
add-type @" 
    using System.Net; 
    using System.Security.Cryptography.X509Certificates; 
    public class TrustAllCertsPolicy : ICertificatePolicy { 
     public bool CheckValidationResult(
      ServicePoint srvPoint, X509Certificate certificate, 
      WebRequest request, int certificateProblem) { 
      return true; 
     } 
    } 
"@ 
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy 

# Try setting other attributes on the ServicePointManager class 
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls -bxor [System.Net.SecurityProtocolType]::Ssl3 
[System.Net.ServicePointManager]::Expect100Continue = $false; 

# Initiate the web request 
$r = [System.Net.WebRequest]::Create("http://192.168.1.7/GetStatusAsJson") 
# Try long timeouts, with KeepAlive set to false; Also try giving it a user agent string etc. 
$r.Timeout = 5000 
$r.ReadWriteTimeout = 5000 
$r.KeepAlive = $false 
$r.Method = "GET" 
$r.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"; 
$r.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; 
$resp = $r.GetResponse() 
+0

すべての '$ 'は何ですか? –

+1

「ブラウザが何をしているのかわかりません」...フィドラーがあなたを助けてくれるかもしれません。 – spender

+0

'[Net.ServicePointManager] :: SecurityProtocol = [Net.SecurityProtocolType] :: Tls12' – BenH

答えて

0

私はMSXML2.XMLHTTP.3.0でvbscriptを使用して終了し、powershellからvbscriptを実行しました。

on error resume next 
Dim oXMLHTTP 
Dim oStream 

Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.3.0") 
oXMLHTTP.Open "GET", WScript.Arguments.Item(2) & "/OpenDoor", False 
oXMLHTTP.Send 

If oXMLHTTP.Status = 200 Then 
    Set oStream = CreateObject("ADODB.Stream") 
    oStream.Open 
    oStream.Type = 1 
    oStream.Write oXMLHTTP.responseBody 
    oStream.SaveToFile WScript.Arguments.Item(0) & "\OpenDoor.html" 
    oStream.Close 
End If 
関連する問題