Я использовал C # для создания DLL, которая использует WebRequest для доступа к WebService. Эта DLL объявлена как ComVisible, поэтому я могу использовать ее с Delphi.
Если WebRequest работает в незашифрованном виде, все работает нормально. Но когда я использую https в качестве протокола, я получаю следующее сообщение об ошибке:
Базовое соединение было закрыто: при отправке произошла непредвиденная ошибка.
Невозможно прочитать данные из транспортного соединения: Eine vorhandene Verbindung wurde vom Remotehost geschlossen.
Но та же DLL работает, когда я использую ее из приложения .NET.
Я создал минимальный пример проекта, чтобы проверить, можно ли воспроизвести ошибку, и у меня возникла та же проблема.
Вот код с веб-запросом
[Guid("D0AAE68A-D2C0-4015-8DE6-471879267418"), ClassInterface(ClassInterfaceType.AutoDual), ProgId("WebRequestTest")]
[ComVisible(true)]
public class ComClient
{
public bool Authenticate(string customer)
{
var request = WebRequest.Create(@"https://server.azurewebsites.net/api/authenticate?apikey=xxxx&customer=" + customer);
request.Method = "GET";
try
{
using (var response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
{
string responseString = streamReader.ReadToEnd();
Trace.WriteLine(responseString);
return true;
}
}
}
catch (Exception exc)
{
Trace.WriteLine(exc);
return false;
}
}
}
В Delphi код также маленький и простой
procedure TForm1.btnTestClick(Sender: TObject);
var
client: TComClient;
begin
client := TComClient.Create(self);
if client.Authenticate('xxxxxxxx') then
Application.MessageBox('Ok', '', MB_OK + MB_ICONINFORMATION)
else
Application.MessageBox('Error', '', MB_OK + MB_ICONINFORMATION);
client.Free;
client := nil;
end;
Чтобы проверить это на чистом .NET, я создал небольшой модульный тест, который работает без ошибок.
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
ComClient client = new ComClient();
bool result = client.Authenticate("xxxxxxxx");
Assert.IsTrue(result);
}
}
Мне кажется, что .NET Framework не полностью инициализируется при использовании сборки .NET из COM-приложения.
Как уже упоминалось, вызов работает нормально, если я переключаюсь на http вместо https.