delphi调用C#写的web服务例子----------,重点 InvRegistry.RegisterInvokeOptions

http://blog.csdn.net/xcplates/archive/2009/11/29/4900036.aspx

最近一个项目用到了delphi调用C#写的web服务的功能。用了一天的时间找原因,终于测试通过了。

这是一个通过web服务把一个照片上传到网站指定位置的方法。先测试了N次都不成功,通过跟踪发现delphi根本没传过来任何值,通过查资料发现VS2005 默认是用的 SoapDocumentProtocol而Delphi 是使用的 SoapRpcProtocol.这会造成所以客户端传过去的字符串变

成null,需要在生成的接口单元的INITIALIZATION 部分加上一句:InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap), ioDocument);

搞定了。

服务代码:

[WebMethod]

public int UploadFile(byte[] fs, string FileName)

{

try

{

///定义并实例化一个内存流,以存放提交上来的字节数组。

///定义实际文件对象,保存上载的文件。

string FullFilename = Server.MapPath("photo\\") + FileName;

if (File.Exists(FullFilename)) { File.Delete(FullFilename); }

FileStream f = new FileStream(FullFilename, FileMode.Create, FileAccess.Write);

f.Write(fs, 0, fs.Length);

f.Close();

f = null;

return 1;

}

catch

{

return 2;

}

}

delphi客户端代码:

procedure TFrmUpLoad.btn2Click(Sender: TObject);

function ReadFile(fileName:string): TByteDynArray;

var

fs:TFileStream;

iSize:Int64;

begin

try

fs:=TFileStream.Create(fileName,fmOpenRead);

iSize:=fs.Seek(0,soFromEnd);

SetLength(Result,iSize);

fs.Seek(0,soFromBeginning);

fs.ReadBuffer(Result[0],iSize);

finally

fs.Free;

end;

end;

var

defWSDL,

defURL,

defSvc ,

defPrt :string;

MyWSUpFile:WSUpFileSoap;

fs: TByteDynArray;

fileName:string;

begin

fs:=ReadFile(edt1.Text);

defWSDL := 'http://'+sysinfo.WZ+'/wsupfile.asmx?wsdl';

defURL := 'http://'+sysinfo.WZ+'/wsupfile.asmx';

defSvc := 'WSUpFile';

defPrt := 'WSUpFileSoap';

HTTPRIO1.WSDLLocation:=defWSDL;

HTTPRIO1.Port:=defPrt;

HTTPRIO1.URL:=defURL;

HTTPRIO1.Service:=defSvc;

HTTPRIO1.HTTPWebNode.UseUTF8InHeader:=true;

fileName:=HYBH+ExtractFileExt(edt1.Text);

//注意这一行,可在程序运行中动态改变服务地址,以前俺就不知道这个。

MyWSUpFile:=GetWSUpFileSoap(True,defWSDL,HTTPRIO1);

//MyWSUpFile:=HTTPRIO1 as WSUpFileSoap;

try

try

case (MyWSUpFile.UploadFile(fs,fileName)) of

0:MyShowMessage('用户无权限');

1:begin

FrmHYGL.ADOQuery1.Edit;

FrmHYGL.ADOQuery1.FieldByName('ZP').AsString:=fileName;

FrmHYGL.ADOQuery1.Post;

MyShowMessage('上传成功');

end;

2:MyShowMessage('上传失败');

end;

finally

MyWSUpFile:=nil;

end;

except

MyShowMessage('调用web服务失败!');

end;

end;

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xcplates/archive/2009/11/29/4900036.aspx