2016-03-20 8 views
0

Ich verwende ein Hardwaregerät und möchte einige Operationen darauf ausführen.So verwenden Sie cURL in ASP.NET mit Cookie-Datei

Gegenwärtig verwendet es cURL, um die Operationen auszuführen. Aber ich möchte das gleiche in ASP.NET Web Forms-Anwendung zu tun, da unten sind die CURL Befehle, die das Gerät verwenden:

1) Zuerst muss ich in einer Cookie-Datei der Benutzerauthentifizierung speichern:

curl -1 -v -L -k -c cookie.txt -d save=2 -d adm_name=admin -d adm_pwd=admin https://10.71.1.111/check.shtml 

Dieses Geschäft cookie.txt10 in meinem Ordner.

2) Jetzt muss ich den zweiten Befehl ausführen, um die Hauptoperation zu tun (Benutzer erstellen in diesem Fall)

curl -1 -v -L -k -b cookie.txt -d save=1 -d U1=michael -d P1=abcd1234 -d M1=00:09:6B:CD:88:00 -d C1=d -d R1=FinanceDep https:// 10.71.1.111/UserAuthentication/AddUser.shtml 

Hier schicke ich die cookie.txt Datei, um den Benutzer zu erstellen. In diesem Befehl sind U1, P1, M1, C1, R1 die Parameter.

Kann mir jemand helfen, das Gleiche von ASP.NET

Grüße Santanu

EDIT zu tun:

Auf Grundlage der Antwort ich den Code in VB.NET umgewandelt und verwendet es, aber leider ist es noch keinen Fehler geben und in alles zurück Antwort

Dim Glas als neue CookieContainer()

 Dim target As New Uri("https://x.x.x.x/check.shtml") 

     'jar.Add(New Cookie("adm", "admin")) 
     'jar.Add(New Cookie("admpwd", "6e49b5b6c16eff37c0d8217382fe1c7e")) 
     'jar.Add(New Cookie("first_login_home_page", "home.shtml")) 
     'jar.Add(New Cookie("name", "value")) 

     jar.Add(New Uri("https://x.x.x.x/check.shtml"), New Cookie("adm", "admin")) 
     jar.Add(New Uri("https://x.x.x.x/check.shtml"), New Cookie("admpwd", "6e49b5b6c16eff37c0d8217382fe1c7e")) 
     jar.Add(New Uri("https://x.x.x.x/check.shtml"), New Cookie("first_login_home_page", "home.shtml")) 

     Dim request As HttpWebRequest = DirectCast(WebRequest.Create("https://x.x.x.x/UserAuthentication/AddUser.shtml"), HttpWebRequest) 

     request.CookieContainer = jar 
     request.AllowAutoRedirect = True 
     ' request.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications 

     ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) 


     request.Method = "POST" 

     Dim fields As New NameValueCollection() 
     fields.Add("save", "1") 
     fields.Add("U1", "michael") 
     fields.Add("P1", "abcd1234") 
     fields.Add("C1", "1") 
     fields.Add("R1", "FinanceDep") 



     Using requestBody As Stream = request.GetRequestStream() 
      Using wtr As New StreamWriter(requestBody, Encoding.ASCII) 
       Dim first As [Boolean] = True 
       For Each key As [String] In fields.Keys 
        If Not first Then 
         wtr.Write("&"c) 
        End If 
        Dim keyEnc As [String] = HttpUtility.UrlEncode(key) 
        Dim valEnc As [String] = HttpUtility.UrlEncode(fields(key)) 

        wtr.Write(keyEnc) 
        wtr.Write("="c) 
        wtr.Write(valEnc) 
        first = False 
       Next 
      End Using 
     End Using 


     Dim response As HttpWebResponse = Nothing 

     Try 
      response = request.GetResponse() 
     Catch wex As WebException 
      If wex.Response IsNot Nothing Then 
       response = wex.Response 
      End If 
     End Try 

Antwort

0

Für HTTP-Anfragen, hat .NET drei Möglichkeiten:

  • HttpWebRequest - einen einfachen Single-Request/Response mit einem blockierenden API.
  • HttpClient - in .NET 4 eingeführt, hat eine async API.
  • WebClient - eine Stateful Wrapper um HttpWebRequest. Ich empfehle es nicht.

Meine persönliche Präferenz ist HttpWebRequest zu verwenden, weil ich Umgang mit Asynchron-Anrufe in den Fällen, wo blockierungs Anrufe sind in Ordnung hässlich zu sein, und für seine relative auch simplicitly:

Ihre curl Optionen sind:

-1  Force TLS 
-v  Verbose 
-L  Follow HTTP Location: header in redirections 
-k  Disables TLS certificate CA checking 
-c  Specify cookie jar file 
-d  Specify request body form fields and use `application/x-www-form-urlencoded` 

Dies kann etwa so HttpWebRequest umgewandelt werden:

CookieContainer jar = new CookieContainer(); 
jar.Add(new Cookie("name", "value")); 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://10.71.1.111/check.shtml"); 
request.CookieContainer = jar; 
request.AllowAutoRedirect = true; 
request.ServerCertificateValidationCallback += delegate(sender, certificate, chain, sslPolicyErrors) { 
    return true; // ignore all certificate errors 
}; 
request.Method = "POST"; 

NameValueCollection fields = new NameValueCollection(); 
fields.Add("save", "2"); 
fields.Add("adm_name", "admin"); 
fields.Add("adm_pwd", "admin"); 
fields.Add("U1", "michael"); 

// Set request body 
using(Stream requestBody = request.GetRequestStream()) 
using(StreamWriter wtr = new StreamWriter(requestBody, Encoding.ASCII)) { 
    Boolean first = true; 
    foreach(String key in fields.Keys) { 
     if(!first) wtr.Write('&'); 
     String keyEnc = HttpUtility.UrlEncode(key); 
     String valEnc = HttpUtility.UrlEncode(fields[key]); 

     wtr.Write(keyEnc); 
     wtr.Write('='); 
     wtr.Write(valEnc); 
     first = false; 
    } 
} 

HttpWebResponse response = null; 
try { 
    response = request.GetResponse(); 
} catch(WebException wex) { 
    if(wex.Response != null) response = wex.Response; 
} 

// do stuff with response 

Nicht e, dass die -1 Option nicht gilt, da HttpWebRequest die systemweiten TLS-Einstellungen verwendet, und da es die Verbindung mit dem https://-Schema verbindet, wird es nicht auf einfaches HTTP zurückgreifen.

Ich sehe, Sie verwenden eine Cookie-Datei, die auf dem Dateisystem vorhanden ist. Sie müssen denselben Inhalt in die Variable jar eingeben.Ich habe ein Beispiel Cookie (Name:Value) zur Verfügung gestellt.

Das Festlegen der Eigenschaft AllowAutoRedirect auf true ist nicht erforderlich, da dies der Standardwert der Eigenschaft ist.

Schließlich nimmt der Rest des Codes jedes Schlüssel + Name-Paar und URL codiert es in den Anfragetext. Ich stimme zu, es ist kompliziert und ich bin überrascht, dass HttpWebRequest nicht mit einer einfachen Möglichkeit, eine URL-codierte Anfrage Körper zu generieren kommen.

+0

Lieber Dai, Danke für Ihre Lösung, ich habe zwei Zweifel 1) Sie senden diese Anfrage an https://10.71.1.111/check.shtml von wo bekomme ich die Authentifizierung, aber nicht auf https: // 10.71. 1.111/UserAuthentication/AddUser.shtml, wo das Gerät den Benutzer tatsächlich erstellt. Werde ich direkt auf https: // 10.71.1.111/UserAuthentication/AddUser.shtml feuern 2) wenn ich direkt auf https: // 10.71.1.111/UserAuthentication/AddUser.shtml fire dann wie wird es das Cookie bekommen oder es wird automatisch erstellt es. Es tut mir wirklich leid, dass ich dich danach gefragt habe, aber ich bin neu und frage dasselbe. –

+0

I Tyied den obigen Code, aber es funktioniert nicht auf Antwort = request.GetResponse(); seine Rückkehr NULL –

+0

@SantanuDas 'GetResponse' gibt nie Null zurück, es löst eine Ausnahme aus, wenn ein Fehler auftritt. Debuggen Sie Ihren Code und beobachten Sie alle ausgelösten Ausnahmen. – Dai

Verwandte Themen