Frage

muss ich einen Beitrag an einen Dritten https-URL machen, um Daten procesed zu erhalten und zurückgeschickt. Und alles, was ich als ein Beispiel habe, ist dies:

$signature= foo_string;
$data_to_post = json_dictionary;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $base_url);
curl_setopt($ch, CURLOPT_USERPWD, "$user:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER,array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_HTTPHEADER,array("JSON-Signature: $signature"));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_to_post);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);

Wie wir mit ASP .NET C # 2.0 arbeiten, ich habe in dem Hafen, aber ich bekomme immer einen nicht autenticated Fehler.

Hier ist, was ich tue:

HttpWebRequest q = (HttpWebRequest)WebRequest.Create(Host + ":" + Port);
                ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(new interhanse().AcceptAllCertifications);                

                q.Method = "POST";
                q.Headers.Add("JSON-Signature:" + GetSignature(data));
                q.ContentType = "application/json";

                q.UseDefaultCredentials = false;
                q.Credentials = new NetworkCredential(user,pwd, Host);

                byte[] buffer = UTF8Encoding.UTF8.GetBytes(data);

                q.ContentLength = data.Length;                

                Stream oStream = q.GetRequestStream();
                StreamWriter oWriter = new StreamWriter(oStream);
                oWriter.Write(buffer);
                oWriter.Close();


                HttpWebResponse reps = q.GetResponse() as HttpWebResponse;

Ich habe alle SO Fragen las ich über diese finden kann, aber ich bekomme keine Verbesserungen. Vielen Dank im Voraus!

War es hilfreich?

Lösung

Nun, eine Sache, die Sie falsch tun, ist unter der Annahme, dass die Länge in Bytes ist das gleiche wie die Länge in Zeichen . Sie sollten buffer.Length für den Inhalt Länge verwenden. Sie sind auch mit einem Byte-Array Aufruf StreamWriter.Write. Sie sollten das nicht tun - Sie sollten nur den Strom verwenden, wie Sie bereits die Codierung getan haben:

byte[] buffer = Encoding.UTF8.GetBytes(data);

q.ContentLength = buffer.Length;
using (Stream stream = q.GetRequestStream())
{
    stream.Write(buffer, 0, buffer.Length);
}

Nun, das wird das Authentifizierungsproblem nicht lösen. Sie können feststellen, dass gerade Einstellung PreAuthenticate lösen, dass, obwohl:

q.PreAuthenticate = true;

Wenn das nicht funktioniert, ich schlage vor, Sie laufen Wireshark und Blick auf die Unterschiede zwischen der Anfrage durch den Locken und die Anforderung von .NET.

Andere Tipps

Ich denke, man sollte nicht den Host in der Authentifizierung liefern ...

q.Credentials = new NetworkCredential(user,pwd);

Was wäre so etwas wie:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Host + ":" + Port);
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(new interhanse().AcceptAllCertifications);

request.Method = "POST";
request.Headers.Add("JSON-Signature:" + GetSignature(data));
request.ContentType = "application/json";

request.UseDefaultCredentials = false;
request.Credentials = new NetworkCredential(user, pwd);

byte[] buffer = UTF8Encoding.UTF8.GetBytes(data);

request.ContentLength = buffer.Length;
using (Stream oStream = request.GetRequestStream()) {
    oStream.Write(buffer, 0, buffer.Length);
}
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
    // load data from response here
}

Auch sollten Sie bei jeder Anfrage der Servicestelle Validierungs Delegaten vermeiden Zuweisung dies die Anforderungen verlangsamt zunehmend, weil die Validierung mehrere Male durchgeführt wird, und es ist auch ein bisschen eine Speicherleck.

curl_setopt($ch, CURLOPT_USERPWD, "$user:$password");

Hier ist, wie Sie diese CURLOPT_USERPWD in Asp.Net hinzufügen:

    private async Task<string> Execute(string url, string query, string user, string pasword)
    {
        HttpClient httpClient = new HttpClient();
        var baseUri = new Uri(url, UriKind.Absolute);  // e.g. http://somedomain.com/endpoint
        Uri request = new Uri(baseUri, query);    // with query e.g. http://somedomain.com/endpoint?arg1=xyz&arg2=abc

        // Add a new Request Message
        HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, request);

        // add headers -> CURLOPT_USERPWD equivalent
        var encodedStr = Convert.ToBase64String(Encoding.Default.GetBytes(string.Format("{0}:{1}", user, password)));
        var authorizationKey = "Basic" + " " + encodedStr;    // Note: Basic case sensitive
        requestMessage.Headers.Add("Authorization", authorizationKey);

        // if POST - do this instead
        // content
        //HttpContent content = new StringContent(jsonContent);     // string jsonContent i.e. JsonConvert.SerializeObject(YourObject);
        //requestMessage.Content = content;
        //requestMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        // execute
        HttpResponseMessage responseMessage = await httpClient.SendAsync(requestMessage);
        var responseString = await responseMessage.Content.ReadAsStringAsync();    // reads it as string; 

        // if json and you need to convert to an object do this
        // var myresponse = JsonConvert.DeserializeObject<YourMappedObject>(responseString);

        return responseString;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top