PDA

View Full Version : null برگرداندن تابع هنگام فراخوانی در وب سرویس دریافت اس ام اس



SirMehdi
یک شنبه 15 مرداد 1391, 21:26 عصر
سلام دوستان
من می خوام از یک وب سرویس تو دلفی جهت دریافت اس ام اس استفاده می کنم ولی متاسفانه وقتی فراخوانی می کنم null بر می گردونه و همین رو وقتی تو دات نت اجرا می کنم مقادیر رو بصورت صحیح بر می گردونه نمونه کدی که استفاده کردم رو در ادامه میزارم ببینید آیا کدم مشکل داره؟
(خروجی تابع اونجوری که تو دات نت تستش کردم جدولی از اطلاعات بود)
این وب سرویسم هست
البته اونجاهایی که * دار هست رو خودم اضافه کردم چون نوع خروجی متد اس ام اس های دریافتی فقط TRemotable بود






unit smsService;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns, DBTables;

type


ReceiveSmsResult = class; { "http://tempuri.org/" }


ArrayOfString = array of WideString; { "http://tempuri.org/" }
ArrayOfLong = array of Int64; { "http://tempuri.org/" }
ArrayOfInt = array of Integer; { "http://tempuri.org/" }


// ************************************************** ********************** //
// Namespace : http://tempuri.org/
// ************************************************** ********************** //

ReceiveSmsResult = class(TRemotable)
private
*** Order: Integer;
*** SmsNumber: WideString;
*** SmsDesc: WideString;
*** GetId : Int64;
*** FromNumber : WideString;
*** ReceiveDate : TXSDateTime;
*** SrDate : TXSDateTime;
public
*** destructor Destroy; override;
published
*** property POrder: Integer read Order;// write SetOrder;
*** property PSmsNumber: WideString read SmsNumber;// write SetSmsNumber;
*** property PSmsDesc: WideString read SmsDesc;// write SetSmsDesc;
*** property PGetId: Int64 read GetId;// write SetPGetId;
*** property PFromNumber: WideString read FromNumber;// write SetPFromNumber;
*** property PReceiveDate: TXSDateTime read ReceiveDate;// write SetPReceiveDate;
*** property PSrDate: TXSDateTime read SrDate;// write SetPSrDate;
end;

ArrayReceiveSmsResult = array of ReceiveSmsResult;

// ************************************************** ********************** //
// Namespace : http://tempuri.org/
// soapAction: http://tempuri.org/%operationName%
// transport : http://schemas.xmlsoap.org/soap/http
// binding : ServiceSoap
// service : Service
// port : ServiceSoap
// URL : http://mehrafraz.com/webservice/Service.asmx
// ************************************************** ********************** //
ServiceSoap = interface(IInvokable)
['{77573149-9C57-FA51-F11F-EFD527C91BD9}']
function KillOMobile(const cCommand: WideString): Integer; stdcall;
function KillProccess(const cCommand: WideString): Integer; stdcall;
function checkSendEmailToServer: Boolean; stdcall;
function GetEmails: Boolean; stdcall;


function ReceiveSms(const
cUserName: WideString; const
cPassword: WideString; const
lReceiveAllmsg: Boolean; const
cDomainName: WideString; const
cFromnumber: WideString): ReceiveSmsResult; stdcall;

end;

function GetServiceSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): ServiceSoap;


implementation

function GetServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): ServiceSoap;
const
defWSDL = 'http://xxxraz.com/webservice/Service.asmx?WSDL';
defURL = 'http://xxxz.com/webservice/Service.asmx';
defSvc = 'Service';
defPrt = 'ServiceSoap';
var
RIO: THTTPRIO;
begin
Result := nil;
if (Addr = '') then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;
if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;
RIO.HTTPWebNode.UseUTF8InHeader := true; //????,????UTF-8????
RIO.Converter.Encoding:='UTF-8';

try
Result := (RIO as ServiceSoap);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
end;

destructor ReceiveSmsResult.Destroy;
var
I: Integer;
begin
if Assigned(SrDate) then
SrDate.Free;
inherited Destroy;
end;

initialization
InvRegistry.RegisterInterface(TypeInfo(ServiceSoap ), 'http://tempuri.org/', 'utf-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Ser viceSoap), 'http://tempuri.org/%operationName%');
InvRegistry.RegisterInvokeOptions(TypeInfo(Service Soap), ioDocument);
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfSt ring), 'http://tempuri.org/', 'ArrayOfString');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfLo ng), 'http://tempuri.org/', 'ArrayOfLong');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfIn t), 'http://tempuri.org/', 'ArrayOfInt');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayRece iveSmsResult), 'http://tempuri.org/', 'ArrayReceiveSmsResult');
RemClassRegistry.RegisterXSClass(ReceiveSmsResult, 'http://tempuri.org/', 'ReceiveSmsResult');

//RemClassRegistry.RegisterXSClass( IncomeFormat, 'http://tempuri.org/', 'ReceiveSmsResult');


end.





و کدی که با اون فراخونیش کردم »:






procedure TForm1.btn1Click(Sender: TObject);
var
objAllMsg : array[0..0] of ReceiveSmsResult;
begin
objAllMsg[0] := GetServiceSoap.ReceiveSms('test', 'test2', true, 't', '3000330000');
end;




ولی متاسفانه خروجی Null هستش یعنی مقادیر تک تک خونه هایی که تو آرایه هست یا صفره یا نال!!!!

به نظرتون کجای کارم مشکل داره؟ یا می تونه مشکل از وب سرویس باشه با توجه به اینکه همین سرویس تو دات نت تست کردم درسن عمل می کرد و یک دیتا تیبل بر می گردوند؟؟؟؟؟؟



یک نکته دیگر که شاید برای سایر کسانی که در آینده این پست رو بخونند مفید باشه اینکه من موقع ارسال هم مشکل داشتم و تایع ارسال بجای شماره پیگیری نال و خطا بر می گردوند که با کلی سرچ و اضافه کردن خط زیر به وب سرویسم مشکلم حل شد



InvRegistry.RegisterInvokeOptions(TypeInfo(Service Soap), ioDocument);