我正在将D2006程序转换为D2010.我的数据库中每个字符串都有一个存储在单个字节中的值,我需要将其加载到具有LoadFromStream的控件中,因此我的计划是将字符串写入流并将其与LoadFromStream一起使用.但它没有用.在研究这个问题时,我看到一个问题告诉我,我真的不明白从AnsiString到Unicode字符串的转换是如何工作的.这是一段独立的代码,说明了我感到困惑的问题:
procedure TForm1.Button1Click(Sender: TObject); {$O-}
var
sBuffer: String;
oStringStream: TStringStream;
sAnsiString: AnsiString;
sUnicodeString: String;
iSize1,
iSize2: Word;
begin
sAnsiString := '12345';
oStringStream := TStringStream.Create(sBuffer);
sUnicodeString := sAnsiString;
iSize1 := StringElementSize(sAnsiString);
iSize2 := StringElementSize(sUnicodeString);
oStringStream.WriteString(sUnicodeString);
end;
Run Code Online (Sandbox Code Playgroud)
如果你在最后一行中断,并检查oStringStream的Bytes属性,你会看到它看起来像这样:
Bytes (49 {$31}, 50 {$32}, 51 {$33}, 52 {$34}, 53 {$35}
Run Code Online (Sandbox Code Playgroud)
我期待它可能看起来像
(49 {$31}, 00 {$00}, 50 {$32}, 00 {$00}, 51 {$33}, 00 {$00},
52 {$34}, 00 {$00}, 53 {$35}, 00 {$00} ...
Run Code Online (Sandbox Code Playgroud)
显然我的期望是错误的.但是,如何将AnsiString转换为unicode?
我没有从LoadFromStream中获得正确的结果,因为它一次从流中读取两个字节,但它接收的数据不是那样排列的.我应该做些什么来为LoadFromStream提供基于unicode字符串的良好数据流?
谢谢您的帮助.
我正在尝试使用Delphi 2010和Indy进行Web服务的概念验证消费.我的代码是:
procedure TForm1.Log(const sEvent, sMsg: String);
const sPrior: String = '';
begin
if sEvent <> sPrior then begin
mTraffic.Lines.Append('');
mTraffic.Lines.Append(Format('%s: %s', [sEvent, FormatDateTime('mm/dd/yyyy hh:nn:ss.zzz', Now)]));
mTraffic.Lines.Append('--------------------------------------------------------------------------------');
sPrior := sEvent;
end;
mTraffic.Lines.Append(sMsg);
Application.ProcessMessages;
end;
function TForm1.BuildRequest: String;
const MINPERDAY = 1440;
var slRequest: TStringList;
sFileName: String;
sID: String;
sGUID: String;
oDoc: TNativeXML;
oNode: TXmlNode;
uNow: _SystemTime;
dtNow: TDateTime;
sNow: String;
sNonce: String;
oIdmd5: TIdHashMessageDigest5;
begin
sFileName := 'Send.xml';
slRequest := TStringList.Create;
oIdmd5 := TIdHashMessageDigest5.Create;
oDoc := TNativeXML.Create;
try
oDoc.LoadFromFile(sFileName);
SetAttrib(oDoc, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Delphi 2010和Indy来使用Web服务.要建立一个可用的SOAP流来与我的程序创建的SOAP流进行比较,我在SOAPUI中进行测试.我正在使用Web服务提供程序提供的SOAP流,它也匹配WSDL文件中指定的SOAP流.我从服务中收到HTTP 400(错误请求)错误.
从我在网上找到的内容来看,似乎收到HTTP 400错误表明您的SOAP请求格式错误且Web服务无法读取.我已经使用XMLPad测试了我的SOAP流,并且XML似乎已经很好地形成了.我想这可能意味着某些东西与其架构要求不匹配.如果不希望以纯文本形式发送,我将首先检查密码的模式描述.我还应该检查什么以消除HTTP 400错误?
这是我的请求(更少的用户名和密码),如果有帮助:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:xop="http://www.w3.org/2004/08/xop/include"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://wwww3.org/2001/XMLSchema-instance">
<soap:Header>
<wsa:Action>http://edd.ca.gov/SendTransmission</wsa:Action>
<wsa:MessageID>urn:uuid:5aa788dc-86e1-448b-b085-2d2743cf9f26</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
</wsa:ReplyTo>
<wsa:To>http://fsettestversion.edd.ca.gov/fsetproxy/fsetservice.asmx</wsa:To>
<wsse:Security soap:mustUnderstand="1">
<wsse:UsernameToken wsu:Id="UsernameToken">
<wsse:Username>#USERNAME#</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">#PASSWORD#/wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">O5QWht1bslLCX6KnlEypAA==</wsse:Nonce>
<wsu:Created>2012-02-29T22:32:38.250Z</wsu:Created>
</wsse:UsernameToken>
<wsu:Timestamp wsu:Id="Timestamp-805a7373-335c-43b6-ba21-6596c4848dbf">
<wsu:Created>2012-02-22T15:41:42Z</wsu:Created>
<wsu:Expires>2012-02-22T15:46:42Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</soap:Header>
<soap:Body>
<SendTransmission xmlns="http://edd.ca.gov/">
<SendTransmissionRequest xmlns="http://www.irs.gov/a2a/mef/MeFTransmitterServiceWse.xsd">
<TransmissionDataList>
<Count>1</Count>
<TransmissionData>
<TransmissionId>123456789</TransmissionId>
<ElectronicPostmark>2012-02-22T07:41:42.2502206-08:00</ElectronicPostmark>
</TransmissionData>
</TransmissionDataList>
</SendTransmissionRequest>
<fileBytes>
<xop:Include href="cid:1.634654933022658454@example.org"/>
</fileBytes>
</SendTransmission>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个 SOAP 客户端来处理由以下位置的 WSDL 文件描述的 Web 服务的加州工资税电子报告:FSET Service。在此 WSDL 文件中,引用了多个模式,其中包括http://schemas.xmlsoap.org/ws/2004/08/addressing中的一个模式,该模式似乎在程序到达 OnBeforeExecute 事件之前就将其停止。
为了开始这个项目,我尝试访问WSDL 文件中声明的Ping函数。
我现在刚刚获得一些在 Delphi 中创建 SOAP 客户端的经验。我正在使用 Delphi 2010。这是我为达到这一点所做的事情。我使用 WSDL 导入器导入上述地址的文件。它为我创建了一个名为 fsetservice 的单元。然后,我向项目添加了一个表单,并在其中添加了 HTTPRIO 组件。我将组件的 WSDLLocation 设置为 WSDL 文件的本地副本,在表单上放置几个 TMemos 以捕获请求和响应标头,并添加代码来执行此操作。然后我设置了一个按钮,并在其 OnClick 事件中编写了以下代码:
procedure TForm1.Button1Click(Sender: TObject);
var sResponse: String;
begin
sResponse := GetFsetServiceSoap.Ping;
end;
Run Code Online (Sandbox Code Playgroud)
当我单击该按钮时,在到达 HTTPRIO OnBeforeExecute 事件中的断点之前收到此消息:
标头http://schemas.xmlsoap.org/ws/2004/08/addressing:需要最终收件人的操作,但未出现在消息中
我知道我们每个帖子应该只问一个问题,但有时您的了解不够,无法只问一个好问题:
编辑:为了节省其他有相同问题的人的时间,我将我找到的答案放在这些问题下。
看起来 HTTPRIO 组件可能正在根据 WSDL 中引用的模式检查从 WSDL 文件导入的 XML 的完整性。这看起来很酷,但这是真的吗?
*答案:不正确,至少根据http://www.tutorialspoint.com/wsdl/wsdl_definition.htm页面底部的注释。根据注释,该模式不必实际存在于该位置,它只需唯一标识 WSDL 中使用的模式即可。*
在自动创建(且未修改)的 GetFsetService 函数中,我可以一直单步执行到最后,并且错误发生在返回时,似乎不可能单步进入调用错误的实际过程。有没有办法做到我所缺少的?
回答:我仍然不确定这一点,但似乎答案是否定的。无论如何,尽管从头开始编写此代码会更加乏味,但这比等待 WSDL 向导出现奇迹是一个更好的解决方案。
我是否错过了一些内容,说我需要实现为我自动创建的 …
我认为对于熟悉Indy的人来说,这是一个简单的问题.我正在使用Delphi 2010和Indy 10.我正试图开始访问SSL Web服务.我认为如果我能让Fiddler看到我的HTTP流量会更容易.我已经看到StackOverflow上的帖子表明让Fiddler看到你的Indy流量并不重要,你必须配置端口才能使它工作.我的问题是你是怎么做到的?
到目前为止,这是我的代码:
procedure TForm1.Button1Click(Sender: TObject);
var slRequest: TStringList;
sResponse,
sFileName: String;
lHTTP: TIdHTTP;
lIOHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
sFileName := 'Ping.xml';
slRequest := TStringList.Create;
try
slRequest.LoadFromFile(sFileName);
lHTTP := TIdHTTP.Create(nil);
lHTTP.Intercept := IdLogDebug1;
lIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
lHTTP.IOHandler := lIOHandler;
sResponse := lHTTP.Post('https://FSETTESTPROD.EDD.CA.GOV/fsetservice', slRequest);
Memo1.Lines.Text := sResponse;
finally
lIOHandler.Free;
end;
finally
slRequest.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
编辑:如果我没有使用Fiddler的代理并在Wireshark运行时单击按钮,我会在Wireshark中获得此流量.

我正在使用Delphi 2010.是否已取消欢迎页面上添加到收藏夹的功能?我仍然有管理收藏夹,但它只添加编辑和删除选项.也许现在有一种新方法可以添加到收藏夹中.我错过了它.