Я только что столкнулся с подобной проблемой, пытаясь подключить клиента D2007 к службе C #.Детали, которые я нашел, были интересны.В первую очередь импортер Delphi серьезно недоделан.Я переключился на RemObj и продолжал иметь проблемы.Похоже, что в конце дня при вызове веб-службы WCF C # из приложения Delphi интерес представляют 3 вещи.Эти 3 элемента следующие:
1) Убедитесь, что на стороне Delphi версия Soap установлена на 1,2 (это самая простая версия)
2) Команда post:сгенерировано было в том числе неверное действие.Нужно: POST "http://URI/Service/Command" RemObj: POST urn: HCSConnect-WSHCSConnect # Ping Delphi: --- команда post полностью отсутствует ---
Что я сделал, так это изменил некоторые детали в материале Rem Obj и сделал егопохоже на то, что мне нужно
3) С помощью сервиса, который я использовал, мыльный конверт хочет область заголовка, содержащую определение нескольких деталей. В моей ситуации наиболее важными элементами в этом заголовке оказалисьТеги «a: Action» и «a: To». Эти теги отсутствуют в приложениях Delphi, RemObj или других. Поэтому в моих ситуациях я перехватываю xml и заполняю его.
Решения дляпоследние 2 пункта не так просты ... если вы используете Rem Obj, вы можете прочитать о том, как я это исправил и что вы можете сделать на форуме RemObj.
http://connect.remobjects.com/discussion/825/problem-calling-web-service-built-with-c
..... последнее, но не менее важное ...
Я также получил возможность работать с использованием прямых звонков ... если вы не используете RemObj и Delphi - это боль, вы всегда можете просто создать свой пост и xml самостоятельнои отправить его. Так же, как я диd ниже ... помните, post / xml / web - это просто обычный текст, отправляемый туда и обратно.
procedure TMainForm.Button5Click(Sender: TObject);
procedure HandleError(const errorCode: integer);
var
errorMessage: AnsiString;
begin
SetLength(errorMessage, 256);
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_FROM_HMODULE,
Pointer(GetModuleHandle('wininet.dll')),
errorCode, 0, PChar(errorMessage), Length(errorMessage), nil);
SetLength(errorMessage, StrLen(PChar(errorMessage)));
raise Exception.Create(errorMessage);
end;
function BuildHeader: TStringStream;
begin
result := TStringStream.Create('');
try
result.WriteString('Content-Type: application/soap+xml;charset=UTF-8;action="http://Thermo.Connect/IHCSConnect/Ping"' + sLineBreak);
except
result.Free;
raise;
end;
end;
function BuildBody: TStringStream;
begin
result := TStringStream.Create('');
with result do
try
WriteString('<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">' + sLineBreak);
WriteString('<s:Header>' + sLineBreak);
WriteString('<a:Action>http://Thermo.Connect/IHCSConnect/Ping</a:Action>' + sLineBreak);
WriteString('<a:To>http://thermo-pc:2021/WSHCSConnect</a:To>' + sLineBreak);
WriteString('</s:Header>' + sLineBreak);
WriteString('<s:Body>' + sLineBreak);
WriteString('<Ping xmlns="http://Thermo.Connect">' + sLineBreak);
WriteString('</Ping>' + sLineBreak);
WriteString('</s:Body>' + sLineBreak);
WriteString('</s:Envelope>' + sLineBreak);
except;
result.Free;
raise;
end;
end;
var
InetRoot: HINTERNET;
InetConnect: HINTERNET;
Request: HINTERNET;
begin
InetRoot := InternetOpen('GabeCode', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
InetConnect := InternetConnect( InetRoot, 'thermo-pc:2021', 0, '',
'', INTERNET_SERVICE_HTTP, 0, Cardinal(Self));
try
Request := HttpOpenRequest( InetConnect, 'POST', 'WSHCSConnect', 'HTTP/1.1', nil, nil,
INTERNET_FLAG_KEEP_CONNECTION or INTERNET_FLAG_NO_CACHE_WRITE,
0);
try
// build add header items to the post request
with BuildHeader do
try
HttpAddRequestHeaders(Request, PChar(DataString), Length(DataString), HTTP_ADDREQ_FLAG_ADD);
finally
Free;
end;
// build the body of data being posted and send the post
with BuildBody do
try
if not HttpSendRequest(Request, nil, 0, PChar(DataString), Length(DataString)) then
HandleError(GetLastError);
finally
Free;
end;
finally
InternetCloseHandle(Request);
end;
finally
InternetCloseHandle(InetConnect);
end;
finally
InternetCloseHandle(InetRoot);
end;
end;