# Native Code > برنامه نویسی در Delphi > توسعه نرم افزار تحت وب >  نحوه استفاده از وب سرویس ساخته شده به وسیله C#‎.net 2003 در دلفی 7.0

## Colonel

سلام 
من در قسمتی از یک نرم افزار که با Delphi 7.0 نوشته شده مجبورم از یک وب سرویس که یک برنامه نویس دیگه در C#‎.net 2003 نوشته استفاده کنم ولی وقتی در WSLD Import Wizard می خوام URL رو add کنم با error ، مواجح میشم ، لطفا من رو راهنمایی کنید.

----------


## hadisalahi2

دوست عزیز سوال شما خیلی کلیه . بهتره اولا بیشتر توضیح بدید و بعد هم متن خطایی رو که باهاش برخورد کردید رو بنویسید تا دوستان بهتر بتونند کمکتون کنند

----------


## vcldeveloper

متن خطا را بزارید. یخورده بین Web Serviceهای دلفی و دات نت عدم سازگاری هست. البته در نسخه های  جدیدتر - مثل دلفی 2007 - سعی شده این مشکلات برطرف بشه، پس شاید اگر از دلفی 2007 استفاده کنید، مشکل برطرف بشه.

----------


## Colonel

سلام،برنامه با دلفی 7 نوشته شده و من اجازه تغییر IDE رو ندارم (به خاطر تحمیل هزینه هم مالی و هم از نظر زمان)وب سرویس رو هم کسه دیگه ای با C#‎.net 2003 نوشته.من بلدم در محیط .net از وب سرویس استفاده کنم کافیه روی Solution کلیک راست کنید و گزینه Add Web Refrence رو انتخاب کنید و در صفحه بعد URL رو بدید که به یک فایل .asmx ختم میشه.
سوال من اینه که چطوری میتونم فایل asmx رو در Delphi اضافه کنم و با توابع اون کار کنم؟
کدوم Component و کدوم Properties ها .
Soap و ....؟

----------


## vcldeveloper

> سوال من اینه که چطوری میتونم فایل asmx رو در Delphi اضافه کنم و با توابع اون کار کنم؟


فایل asmx رو که نمی تونید به Delphi for Win32 اضافه کنید، فقط می تونید WSDL را دریافت کنید و با استفاده از WSDL Importer کلاس های تعریف شده در آن را در دلفی بسازید. 
این سوال با سوال اولتون که می گفتید در هنگام Import کردن WSDL خطا می گیرید، فرق میکنه.

اگر WSDL به درستی تبدیل به کلاس نمیشه، شاید مجبور بشید یونیت ساخته شده توسط WSDL Importer را دستی ویرایش کنید. البته یک نکته ایی هم هست: WSDL Importer برنامه ایی مستقل از IDE دلفی هست، اگر مشکل از Importer باشه، می تونید از WSDL Importer مربوط به Delphi 2007 استفاده کنید و یونیت مربوطه را باهاش بسازید، بعد اون یونیت را در دلفی 7 استفاده کنید.




> Soap و ....؟


متوجه نشدم منظورتون چی هست.

----------


## Colonel

سلام،من زیاد با دلفی آشنا نیستم،من برنامه نویس vb.net هستم .ببینید من فقط می دونم اگه بخواهیم  از یک Webservice در vb.net استفاده کنیم برای مثال یک webService مجانی روی اینترنت مثل http://www.deeptraining.com/webservi...?op=GetWeather  کافی این Address رو در قسمت Add web Reference وارد کنیم و در صورتی که connection موفقیت آمیز بود یک Object از کلاسی که این Web Service به ما داده بسازیم و با توابع اون ابجکت کار کنیم.حالا سوال من از شما اینه که همین کار رو در  Delphi باید چطوری انجام بدم؟ منظورم از Soap همون کامپونتSoapConnection در دلفیه.
لطفا بگید چطوری باید از یک وب سرویس که یک فایل با پسوند asmx است در دلفی استفاده کنم؟اصلا شما خودتون تا حالا این کارو کردید؟اگه کردید با چه کامپوننت هایی و چه روشی این کار رو انجام دادید. من خودم از دلفی چیز زیادی نمی دونم می تونید یک مثال یا کد بهم بدید؟
ممنون.

----------


## vcldeveloper

> با چه کامپوننت هایی و چه روشی این کار رو انجام دادید. من خودم از دلفی چیز زیادی نمی دونم می تونید یک مثال یا کد بهم بدید؟


ببینید استفاده از یک وب سرویس در دلفی خیلی ساده هست:

- اول باید فایل WSDL را توسط WSDL Importer بگیرید تا Importner کلاس ها و داده های مورد نیاز وب سرویس شما را بسازه و بصورت یک یونیت جدید به پروژه شما اضافه کنه. اسم این یونیت مساوی اسم وب سرویس شما ست، مثلا در مورد وب سرویس Weather، بعد از Import، یک یونیت جدید با نام Weather به پروژه شما اضافه میشه که رابط مربوط به وب سرویس شما درش تعریف شده.

- برای کار با WSDL Importer در دلفی، گزینه New.. از منوی File را کلیک کنید، و در صفحه New Items به تب WebServices برید. اونجا WSDL Importer را پیدا می کنید.

- WSDL Importer از شما URL وب سرویس مورد نظرتون رو میگیره و یونیت ساخته شده را بصورت پیش نمایش به شما نمایش میده. رابط وب سرویس شما بصورت گرافیکی هم در آن نمایش داده میشه. WSDL Importer یک گزینه Options هم داره که از طریق آن می تونید بعضی تنظیمات تبدیل WSDL به Interface دلفی را تغییر بدید.

- بعد از اینکه WSDL شما Import شد، به دو صورت می تونید ازش استفاده کنید:

1- در فایل ساخته شده توسط WSDL Importer یک تابع بصورت GetWebService تعریف شده، مثلا اگر نام وب سرویس شما WeatherSOAP باشه، اسم این تابع میشه GetWeatherSOAP. این تابع یک رابط برای کار با وب سرویس مورد نظر شما را برمیگردونه، و می تونید خیلی راحت ازش استفاده کنید، مثلا:
Edit1.Text := GetWeatherSOAP.GetWeather('New York');

2- استفاده از کامپوننت HTTPRIO. این کامپوننت در تب WebServices از Components Pallet قرار داره. در واقع همون تابع روش اول هم از این کامپوننت استفاده می کرد. HTTPRIO نیاز داره که یجوری WSDL را بهش بدید. دو راه داره، یکی اینکه فایل XML مربوط به WSDL را به خصوصیت WSDLLocation آن اختصاص بدید، در اینصورت، خودش خصوصیات Service و Port را مقداردهی میکنه؛ دوم اینکه آدرس URL وب سرویس را به خصوصیت URL آن اختصاص بدید، در این صورت سعی میکنه وب سرویس را از آدرس داده شده دریافت کنه.
بالافاصله بعد از مشخص شدن وب سرویس، می تونید Interface تعریف شده در وب سرویس (هم نام خود سرویس تعریف شده) خود را از HTTPRIO استخراج کنید. در مثال وب سرویس Weather، نام Interface مربوطه میشه WeatherSoap. بعدش هم می تونید با وب سرویستون کار کنید، مثلا:

(HTTPRIO1 as WeatherSoap).GetWeather('New York';
مثال کاملش در صورتی که بخوای بجای فایل XML مربوط به WSDL، آدرس URLاش رو بدیم، به این صورت میشه:
در این مثال یک Edit1 برای نمایش نتیجه کار Web Service داریم، یک Button1 برای انجام عملیات، و یک HTTPRIO برای کار با WSDL:

procedure TForm1.Button1Click(Sender: TObject);
var
  Weather : WeatherSoap;
  HTTPRIO1 : THTTPRIO;
begin
  HTTPRIO1 := THTTPRIO.Create(nil);
  HTTPRIO1.URL := 'http://www.deeptraining.com/webservices/weather.asmx?op=GetWeather';

  Weather := HTTPRIO1 as WeatherSOAP;
  Edit1.Text := Weather.GetWeather('New York');
end;*
نکته 1:*
بجای نوشتن دو خط اول کد برای ایجاد HTTPRIO و مقدار دادن به خصوصیت URL آن، می تونستید کامپوننت HTTPRIO را از صفحه WebServices روی فرم بندازید و به خصوصیت URL آن مقدار بدید.

*نکته 2:*
اگر  مثل مثال بالا HTTPRIO را بصورت runtime و بدون Owner می سازید (به Create آن پارامتر nil پاس میدید)، لزومی نداره HTTPRIO را خودتان Free کنید، بلکه دلفی بطور خودکار HTTPRIO را آزاد میکنه. برای همین هم در کد بالا HTTPRIO1 که Create شد، جایی Free نشد.

*نکته 3:*
در زمان نوشتن این پست، وب سرویس WeatherSoap جواب نمیداد، یعنی سروری که باید ازش اطلاعات وضع هوا دریافت میشد، کار نمی کرد، و پیام خطا می داد. این ربطی به اشکال در مثال نداره، می تونید در صورت لزوم، از یک وب سرویس دیگه برای آزمایش استفاده کنید.



موفق باشید

----------


## Colonel

سلام من همین الان این webservice رو (http://www.deeptraining.com/webservi...?op=GetWeather)در vb.net امتحان کردم و جواب گرفتم،اما در دلفی نه در قسمت WSDL Importer تونستم URL رو Add کنم و نه کدهایی که برام فرستادید کار می کرد.
شما چطوری این URL رو add کردید؟WSDL Importerبرای من خطای unable to load رو نشون میده.

----------


## Colonel

از همکاری شما ممنونم،بلاخره تونستم Webservice رو add کنم و همونطور که گفته بودید  یک unit بهم داد تا ازش استفاده کنم.
ولی من متوجه نمی شم چرا این webService در vb.net جواب میده و مثلا برای تهران Sunny رو بر می گردونه ولی در دلفی error میده؟
مگه بر اساس فایل XML کار نمی کنه ؟ پس نباید تفاوتی در عملکرد داشته باشه چون همه چیز به XML ترجمه می شه،اینطور نیست؟

----------


## vcldeveloper

> ولی من متوجه نمی شم چرا این webService در vb.net جواب میده و مثلا برای تهران Sunny رو بر می گردونه ولی در دلفی error میده؟
> مگه بر اساس فایل XML کار نمی کنه ؟ پس نباید تفاوتی در عملکرد داشته باشه چون همه چیز به XML ترجمه می شه،اینطور نیست؟


استانداردهایی که برای نقل و انتقال اطلاعات براساس SOAP در نظر گرفته میشه، کاملا با هم هماهنگ نیستند، در پست های قبلی هم گفتم که گاهی اوقات برنامه های دلفی در استفاده از WebServiceهای دات نت و گاهی بالعکس دچار مشکل میشند.
مشکل احتمالا به این مربوطه که نوع داده مورد نظر در WebService به چه نوع داده ایی در دلفی map شده. برای همین گفتم که از Delphi 2007 یا حداقل از WSDL Importerاش استفاده کنید، چون ناسازگاری با دات نت در اون نسخه کمتر شده. در هر حال، می تونید بررسی کنید که WebService شما برای پارامترها و مقدار خروجی چه Typeایی در نظر گرفته، این Type در دات نت به چه Typeایی Map میشه، و در دلفی به چه نوعی. اگر بینشان اختلافی وجود داشت، می تونید یونیت ساخته شده توسط WSDL Importer را دستی تغییر بدید تا Typeها یکسان بشند.
البته این امکان هم وجود داره که مشکل از خود WebService مورد نظر باشه، مثلا در پردازش هایی که در سمت سرور انجام میده، موارد خاص مربوط به دات نت را فقط در نظر گرفته باشه. مثلا در دات نت هر Type ایی، حتی Typeهای پایه مثل Integer یک شی هستند، در حالی که در دلفی Typeهای پایه در داخل خود کامپایلر تعریف شدند و شی نیستند. در دات نت میشه هر Type را به Object که کلاس پایه همه کلاس ها ست، Type-Cast کزد، ولی این کار در دلفی برای کلاس های پایه انجام نمیشه. حالا اگر فرض کنیم WebService شما فرض بگیره که رشته ایی که دریافت میکنه، حتما یک شی هست، و سعی بکنه با آن مثل یک شی رفتار بکنه، با نوع داده دلفی دچار مشکل میشه.
در هر حال، برای استفاده از یک WebService فقط داشتن WSDL آن کافی نیست، بلکه باید به مستندات آن هم مراجعه کرد، شاید ملاحظات و نکاتی در آن درج شده باشه.
می تونید با یک WebService دیگه از سایت دیگه ایی استفاده کنید، که احتمال اینکه منحصرا برای دات نت نوشته شده باشه، کمتر باشه.

----------


## Colonel

ممنون از لطفتون،من امروز WebService ای رو که می خواستم امتحان کردم و کار کرد،مشکلم حل شد،ممنون.

----------

