zoukankan      html  css  js  c++  java
  • delphi调用C#写的web服务例子(重点 InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap), ioDocument);)

    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

  • 相关阅读:
    《需求分析与系统设计》第二篇阅读体会
    《需求分析与系统设计》第一篇阅读体会
    《编写有效用例》第二篇阅读体会
    项目目标文档
    字符流
    字节流
    递归
    File类
    JDBC接口和工具类
    异常
  • 原文地址:https://www.cnblogs.com/linyawen/p/2072134.html
Copyright © 2011-2022 走看看