delphi调用C#写的web服务
2011-07-28 14:17
411 查看
最近一个项目用到了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;
这是一个通过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;
相关文章推荐
- delphi调用C#写的web服务例子
- C# webservice服务在Delphi中的调用问题
- delphi调用C#写的web服务例子-----------(重点 InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap), ioDocu
- delphi调用C#写的web服务例子
- Delphi调用C#web服务参数无法接收的问题
- delphi调用C#写的web服务例子-----------(重点 InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap), ioDocument);)
- delphi调用C#写的web服务例子
- delphi调用C# WEB服务,参数传递问题 (转)
- C#动态调用Web服务的3种方法
- 关于 C# 调用 JavaWebservice服务,版本不一致的问题
- C# 调用 JavaWebservice服务遇到的问题汇总
- C# Web Service 不使用服务引用直接调用方法
- C#动态调用Web服务的3种方法
- (C#)动态调用web服务
- C#调用C语言写的dll,并发布web服务
- C# webservice 动态代理类调用webservice服务方法
- C#动态调用Web服务方法
- 关于C#下写的Web Service 服务在Delphi下调用时的问题
- 关于C#下写的Web Service 服务在Delphi下调用时的问题
- C#动态调用Web服务的3种方法