PDA

View Full Version : اروری در وب سرویس



firststep
جمعه 02 فروردین 1392, 02:33 صبح
با سلام عرض تبریک سال نو

من یک وب سرویس داشتم و هرچقدر تلاش کردم اونو اد کنم نتونستم ارور می ده البته من قبل از این توی c# اونو اد کرده ببودم واستفاده می می کردم امانگار ....
ممنون میشم راهنمایی بفرمایید

ادرس وب سرویس هست
http://www.sms-webservice.ir/v1/v1.asmx

یوسف زالی
جمعه 02 فروردین 1392, 03:58 صبح
سلام. استاندازد WSDL مورد نظر در دلفی ساپورت نمی شه.
از ارائه دهنده سرویس بخواهید اون رو عوض کنه.
اگر قبول نکرد همچنان راهی هست که بشه در دلفی هم اون رو به کار برد. با کمی اصلاح در یونیت generate شده.
موفق باشید.

firststep
جمعه 02 فروردین 1392, 09:02 صبح
فکر نمی کنم عوض کنه چهطور راه حلی است؟

یوسف زالی
جمعه 02 فروردین 1392, 09:13 صبح
معمولا سه جور ارور پیش میاد.

1- ارور آرایه بدون نوع که برای رفعش معمولا "آرایه ای از آرایه ای از رشته" جواب می ده
2- ارور پارامتر همنام که یکیش ثابت و یکیش رفرنس هست که برای رفعش معمولا اولی رو var می کنند و دومی رو حذف.
3- ارور عدم کانکت با یوزر پس که باید در هدر HTTP باشه اما در هدر SOAP هست. شخصا براش راه حل جالبی پیدا نکردم.

باید سورسش رو دستکاری کنید تا جواب بگیرید. معمولا کمی درگیری داره ولی رفع می شه.

اگر لازم بود سورس رو اصلاح کنم با پیام خصوصی یوزر و پس رو بدید تا در مورد نجوه ی اصلاح سورس صحبت کنیم.

firststep
جمعه 02 فروردین 1392, 14:53 عصر
عزیز نیاز به یوزر وپس نداره بدون یوزر پس توی .net اد میشه
ایا
remobject امکانی نداره برای حل این مشکل

BORHAN TEC
شنبه 03 فروردین 1392, 12:35 عصر
سلام
دلفی برای وارد کردن این وب سرویس هیچ مشکلی نداره و بدون خطا تونست اون رو Import کنه(من از XE3 و آپدیت 1 استفاده کرده ام). کار شما یک اشتباه داشت و اون هم اینه که شما برای وارد کردن وب سرویس از آدرس یک سند wsdl استفاده نکرده اید. wsdl با asmx فرق میکنه. به عبارتی شما باید از آدرس زیر به عنوان سند wsdl استفاده کنید:
http://www.sms-webservice.ir/v1/v1.asmx?WSDL
اگر در موقع وارد کردن وب سرویس خطایی رخ داد شاید به خاطر این باشه که تنظیمات پروکسی و ... روی سیستم شما فعاله. در هر صورت من بدون هیچ مشکلی تونستم که کلاس مربوطه را از روی سند wsdl بسازم. البته من مجبور شدم برای این کار از Si###phone(ابزاری برای وصل شدن به صورت غیر رایج به اینترنت) و متد SSH+ برای اتصال استفاده کنم(نمیدونم که این وب سرویس اینطوریه یا سیستم من تنظیماتش به هم خورده، به نظرم مورد دوم هست و من هم این مورد رو بررسی نکردم)
این هم کد یونیت Generate شده با استفاده از خود دلفی:
// ************************************************** ********************** //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL : http://www.sms-webservice.ir/v1/v1.asmx?WSDL
// >Import : http://www.sms-webservice.ir/v1/v1.asmx?WSDL>0
// Encoding : utf-8
// Codegen : [wfForceSOAP11+, wfForceSOAP12+]
// Version : 1.0
// (3/23/2013 1:00:32 PM - - $Rev: 52705 $)
// ************************************************** ********************** //

unit v1;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

const
IS_OPTN = $0001;
IS_UNBD = $0002;
IS_NLBL = $0004;
IS_REF = $0080;


type

// ************************************************** ********************** //
// The following types, referred to in the WSDL document are not being represented
// in this file. They are either aliases[@] of other types represented or were referred
// to but never[!] declared in the document. The types from the latter category
// typically map to predefined/known XML or Embarcadero types; however, they could also
// indicate incorrect WSDL documents that failed to declare or import a schema type.
// ************************************************** ********************** //
// !:double - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:string - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:int - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:long - "http://www.w3.org/2001/XMLSchema"[Gbl]


ArrayOfString = array of string; { "http://www.sms-webservice.ir"[GblCplx] }
ArrayOfArrayOfString = array of ArrayOfString; { "http://www.sms-webservice.ir"[GblCplx] }
ArrayOfLong = array of Int64; { "http://www.sms-webservice.ir"[GblCplx] }

// ************************************************** ********************** //
// Namespace : http://www.sms-webservice.ir
// soapAction: http://www.sms-webservice.ir/%operationName%
// transport : http://schemas.xmlsoap.org/soap/http
// style : document
// use : literal
// binding : SmsV1Soap12
// service : SmsV1
// port : SmsV1Soap12
// URL : http://www.sms-webservice.ir/v1/v1.asmx
// ************************************************** ********************** //
SmsV1Soap = interface(IInvokable)
['{4A5A313E-ED1B-9A00-933A-A240F6F8182A}']
function SendMessage(const Username: string; const PassWord: string; const MessageBodie: string; const RecipientNumbers: ArrayOfString; const SenderNumber: string; const Type_: Integer;
const AllowedDelay: Integer): ArrayOfLong; stdcall;
function GetMessagesStatus(const Username: string; const PassWord: string; const messagesId: ArrayOfLong): ArrayOfLong; stdcall;
function GeCredit(const Username: string; const PassWord: string): Double; stdcall;
function GetAllMessages(const Username: string; const PassWord: string; const numberOfMessages: Integer; const destNumber: string; var ErrNum: Integer): ArrayOfArrayOfString; stdcall;
end;

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


implementation
uses SysUtils;

function GetSmsV1Soap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): SmsV1Soap;
const
defWSDL = 'http://www.sms-webservice.ir/v1/v1.asmx?WSDL';
defURL = 'http://www.sms-webservice.ir/v1/v1.asmx';
defSvc = 'SmsV1';
defPrt = 'SmsV1Soap12';
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;
try
Result := (RIO as SmsV1Soap);
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;


initialization
{ SmsV1Soap }
InvRegistry.RegisterInterface(TypeInfo(SmsV1Soap), 'http://www.sms-webservice.ir', 'utf-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Sms V1Soap), 'http://www.sms-webservice.ir/%operationName%');
InvRegistry.RegisterInvokeOptions(TypeInfo(SmsV1So ap), ioDocument);
InvRegistry.RegisterInvokeOptions(TypeInfo(SmsV1So ap), ioSOAP12);
{ SmsV1Soap.SendMessage }
InvRegistry.RegisterMethodInfo(TypeInfo(SmsV1Soap) , 'SendMessage', '',
'[ReturnName="SendMessageResult"]', IS_OPTN);
InvRegistry.RegisterParamInfo(TypeInfo(SmsV1Soap), 'SendMessage', 'RecipientNumbers', '',
'[ArrayItemName="string"]');
InvRegistry.RegisterParamInfo(TypeInfo(SmsV1Soap), 'SendMessage', 'Type_', 'Type', '');
InvRegistry.RegisterParamInfo(TypeInfo(SmsV1Soap), 'SendMessage', 'SendMessageResult', '',
'[ArrayItemName="long"]');
{ SmsV1Soap.GetMessagesStatus }
InvRegistry.RegisterMethodInfo(TypeInfo(SmsV1Soap) , 'GetMessagesStatus', '',
'[ReturnName="GetMessagesStatusResult"]', IS_OPTN);
InvRegistry.RegisterParamInfo(TypeInfo(SmsV1Soap), 'GetMessagesStatus', 'messagesId', '',
'[ArrayItemName="long"]');
InvRegistry.RegisterParamInfo(TypeInfo(SmsV1Soap), 'GetMessagesStatus', 'GetMessagesStatusResult', '',
'[ArrayItemName="long"]');
{ SmsV1Soap.GeCredit }
InvRegistry.RegisterMethodInfo(TypeInfo(SmsV1Soap) , 'GeCredit', '',
'[ReturnName="GeCreditResult"]');
{ SmsV1Soap.GetAllMessages }
InvRegistry.RegisterMethodInfo(TypeInfo(SmsV1Soap) , 'GetAllMessages', '',
'[ReturnName="GetAllMessagesResult"]', IS_OPTN);
InvRegistry.RegisterParamInfo(TypeInfo(SmsV1Soap), 'GetAllMessages', 'GetAllMessagesResult', '',
'[ArrayItemName="ArrayOfString"]');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfSt ring), 'http://www.sms-webservice.ir', 'ArrayOfString');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfAr rayOfString), 'http://www.sms-webservice.ir', 'ArrayOfArrayOfString');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfLo ng), 'http://www.sms-webservice.ir', 'ArrayOfLong');

end.

ایا
remobject امکانی نداره برای حل این مشکل اولاً در مورد کار شما که توضیحات لازم را دادم و مشکلی باقی نمی ماند ولی اگر قصد استفاده از RemObjects SDK را دارید تمامی مراحل را به همان شکل روتین انجام دهید و در آخر در یونیت Generate شده فقط باید به جای کلمه Type در پارامترهای متدها از کلمه دیگری مثل aType استفاده کنید، چون همانطور که می دانید Type از قبل برای دلفی تعریف شده است و نمی تواند در لیست پارامترها قرار بگیرد.
موفق باشید...

یوسف زالی
شنبه 03 فروردین 1392, 18:48 عصر
کار شما یک اشتباه داشت ..

من هم از WSDL استفاده کردم.
اگر این طوره گویا موتور Importer از نسخه های 7 به این طرف بهبودهایی داشته.
در نسخه ی من پارامتر همنام مشکل بود.
به هر حال همچنان دلفی برای هر WSDL ی نمی تونه Import متاسب رو انجام بده. نمونش رو زیاد داشتم. نه اینکه نشه، باید دستی اصلاح انجام بشه روش.
یادمه خودت زحمت یکیش رو کشیدی.
می شه بگی علت استفاده از REM در اینجا چی هست؟
آبا دلیل خاصی داشته؟

BORHAN TEC
شنبه 03 فروردین 1392, 19:03 عصر
سلام

من هم از WSDL استفاده کردم.
منظور من به جناب firststep بود.

به هر حال همچنان دلفی برای هر WSDL ی نمی تونه Import متاسب رو انجام بده. نمونش رو زیاد داشتم. نه اینکه نشه، باید دستی اصلاح انجام بشه روش.
یادمه خودت زحمت یکیش رو کشیدی.
تقصیر خودمونه! اگه این موارد رو به QC گزارش بدیم این مشکلات حل خواهند شد. مثلاً برای همون موردی که قبلاً حلش کردم راه حل هم پیدا کردیم ولی گزارش ندادیم! :گیج:
در کل این فقط مربوط به دلفی نمیشه، هرچند که این موارد خودش رو بیشتر در دلفی نشون میده. مثلاً اون طرفی که وب سرویس رو میسازه اینترفیس وب سرویس رو خیلی بد طراحی می کنه و همه رو به زحمت میندازه. همیشه موقعی که پای سازگاری با زبانهای برنامه نویسی دیگه مطرح میشه در اینترفیس وب سرویس و یا DLL و ... باید از نوع های داده ای پایه و ساده استفاده بشه ولی چه کنیم که خیلی از سازندگان وب سرویس به این مورد توجه نمی کنند و فقط و فقط در یک یا دو زبان برنامه سازی نتیجه رو تست می کنند. خداییش اگه یه وب سرویس رو طراحیش رو به من می سپردند کاری می کردم که بشه توی اسمبلی هم ایمپورتش کرد. :قهقهه:
البته این مورد آخر رو زیاد جدی نگیرید! :چشمک:

می شه بگی علت استفاده از REM در اینجا چی هست؟
آبا دلیل خاصی داشته؟
من همینطوری از RemObjects SDK استفاده کردم که نحوه رفع مشکل رو هم در دلفی و هم در RemObjects SDK توضیح بدم. همین!

firststep
یک شنبه 11 فروردین 1392, 19:55 عصر
سلام به شما خوبان عزیز
من که هر کاری کردم import نشد نمی دونم چرا ولی error می ده که load نمیشه
در ضمن از unit که شما که شما به عنوان فایل generat قراد داید دوست عریر استفاده کردم اما SmsV1Soap به عنوان یک interface هستش چه شکی باید از این استفاده کرد
اخه وقتی همین url رو در c# اد می کنیم می بینیم که یه کلاسی داره به نام اگه اشتباه نکنم sms ولی اینجا ----
خیلی دوست دارم اینکار رو با دلفی انجام بدم قبلاً یکبار با c# انچامش دادم

BORHAN TEC
یک شنبه 11 فروردین 1392, 20:12 عصر
سلام

اما SmsV1Soap به عنوان یک interface هستش چه شکی باید از این استفاده کرد
خداییش دیگه خسته شدم از بس که آدرس این ویدئو را دادم:
http://www.irstu.com/?p=3461

firststep
یک شنبه 11 فروردین 1392, 20:35 عصر
اها یک گزینه فراموش شده بود شما دست میگین دوست عزیز اما
ایا نمیشه از خوده interface ها درون کلاس دیگه استفاده کرد چون می خوام soap توی یک theread ازش استفاده کنم که در زمانی که پردازش طول می کشه برنامه هنگ نکنه؟؟؟؟؟؟؟

BORHAN TEC
دوشنبه 12 فروردین 1392, 10:27 صبح
ایا نمیشه از خوده interface ها درون کلاس دیگه استفاده کرد چون می خوام soap توی یک theread ازش استفاده کنم که در زمانی که پردازش طول می کشه برنامه هنگ نکنه؟؟؟؟؟؟؟
چرا موقعی که اسم یک وب سرویس میاد کلاً فکر می کنید که همه چیز فرق می کنه؟ یک Interface یک Interface است و از قوانین مربوط به Interface ها تبعیت می کنه. چه مربوط به یک کار ساده باشه، چه وب سرویس و چه کنترل یک فضاپیما یا هم چیز دیگه ای. منابع مختلفی هم وجود داره که در مورد اون توضیح میده. یکی مقاله آقای کشاورز، یکی مربوط به آن 24 ساعت ویدئو که منبع اصلی آن هم مقاله آقای کشاورز است و ده ها مقاله به زبان های انگلیسی و ... .