NTLM-запрос в C # и переполнение стека

У меня есть запрос ntlm в C #, который работает и тот же запрос в php, который подключается, но возвращает ошибку в ответе.

Вот код C #:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://example.com/Query/ExecuteReportView");
httpWebRequest.ContentType = "text/json";
httpWebRequest.Method = "POST";

httpWebRequest.UseDefaultCredentials = false;
httpWebRequest.PreAuthenticate = true;
var c = new NetworkCredential("username", "password", "domain");

CredentialCache credentialCache = new CredentialCache();
credentialCache.Add(new Uri("http://example.com"), "NTLM", c);
httpWebRequest.Credentials = credentialCache;

using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = "{\"SysName\":\"Callbacks\"," +
"\"SysCategory\":\"Eai.CCM.Model.FolderView\"," +
"\"StartIndex\":0," +
"\"PageLength\":10}";streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
Console.Out.WriteLine(result);
}

Console.ReadLine();
}
}
}

Это работает и возвращает строку JSON, как и ожидалось.

Вот моя попытка сделать то же самое в php:

<?php
$data = array
(
"SysName" => "Callbacks",
"SysCategory" => "Eai.CCM.Model.FolderView",
"StartIndex" => 0,
"PageLength" => 10
);
$body = json_encode($data);
$headers = array(
"Transfer-Encoding: chunked",
"Content-Type: application/json");

$ch = curl_init();

curl_setopt($ch, CURLOPT_USERPWD, 'username:password');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, 'example.com/Query/ExecuteReportView');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_FAILONERROR, 0);
curl_setopt($ch, CURLOPT_MAXREDIRS, 100);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, dechex(strlen($body)) . "\r\n" . $body . "\r\n");

curl_exec($ch);

curl_close($ch);
?>

Одно существенное отличие состоит в том, что в php-коде используется чанкованное кодирование, так как подход с длиной содержимого постоянно выдавал ошибку, сообщающую, что мне нужно указать длину содержимого или отправить данные по частям.

Есть ли что-то очевидное, выделяющееся кому-то, что я пропустил в своем PHP-скрипте?

Скрипт php подключается и возвращается ответ, поэтому я явно не даю ему нужную информацию (как в версии c #).

Вот что возвращает версия php:

{"$id":"1","Message":"An error has occurred.","ExceptionMessage":"Object reference not set to an instance of an object.","ExceptionType":"System.Exception","StackTrace":null}

Я использую php 5.6.6.

РЕДАКТИРОВАТЬ:

Мой php-скрипт работает в php 5.2.17, используя длину содержимого вместо фрагментированных закодированных данных.

Та же проблема в php 5.5.21

phpinfo дает следующее для 5.2.17:

cURL support        enabled
cURL Information    libcurl/7.21.0 OpenSSL/0.9.8q zlib/1.2.3

и следующее для 5.6.6

cURL support     enabled
cURL Information 7.40.0
Age              3
Features
AsynchDNS       Yes
CharConv        No
Debug           No
GSS-Negotiate   No
IDN             Yes
IPv6            Yes
krb4            No
Largefile       Yes
libz            Yes
NTLM            Yes
NTLMWB          No
SPNEGO          Yes
SSL             Yes
SSPI            Yes
TLS-SRP         No
Protocols       dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, pop3, pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp
Host            i386-pc-win32
SSL Version     OpenSSL/1.0.1k
ZLib Version    1.2.7.3
libSSH Version  libssh2/1.4.3

0

Решение

Наконец-то получил ответ:

Кажется, что IIS делает вещи для меня. Похоже, что отправляющий заголовок «Transfer-Encoding: chunked» сообщает IIS, что нужно выполнить разбиение на части для меня. Поэтому мне не нужно было самому разбивать данные на части.

<?php
$data = array
(
"SysName" => "Callbacks",
"SysCategory" => "Eai.CCM.Model.FolderView",
"StartIndex" => 0,
"PageLength" => 10
);
$body = json_encode($data);
$headers = array(
"Transfer-Encoding: chunked",
'Content-Type: application/json'
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_USERPWD, 'username:password');
curl_setopt($ch, CURLOPT_URL, 'example.com/Query/ExecuteReportView');
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_exec($ch);
curl_close($ch);
?>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]